【问题标题】:ubuntu linux sed affects file properties? [closed]ubuntu linux sed 影响文件属性? [关闭]
【发布时间】:2015-12-10 18:44:43
【问题描述】:

我有一个包含 75000 个项目的文本文件,每个项目 2 行。第 1 行有一个标识符,第 2 行是一个文本字符串。 我需要删除 130 个项目,我在列表中或可以放入文件中的随机标识符。 我可以对一件物品进行移除,但不能超过一件。 我尝试管道标识符并获得一个空的输出文件。 我尝试了sed -e 'expression' inputfile > outfile 的重复命令。这可行,但需要一个新的输出文件,然后该文件将成为下一次迭代的输入文件,依此类推。这可能是最后的手段。

我试过sed -i in iteration;这会崩溃,错误是输入文件的名称没有文件。如我所见,显然不是这种情况, ls it 并 grep 中的标识符数量。只有 sed 似乎无法读取它。

我什至在网上找到了一个 python/biopython 脚本来解决这个确切的问题,它非常简单并且不给出错误消息,但它也只删除了第一项。

我认为这与实际上不存在的文件属性/临时文件有关(?)。 我正在使用 Ubuntu 12.04 'Precise' 我该如何解决这个问题?

【问题讨论】:

  • 请在您的问题中添加示例输入和该示例输入所需的输出。
  • 使用-i 和命名您自己的 tmp 文件之间的功能差异为零。在这两种情况下都使用临时文件,只是在后者中你可以命名它。对于您选择使用的任何 python 脚本,同上。没有 UNIX 工具可以进行真正的内联文件编辑 - 即使 ed 使用原始文件大小的内部缓冲区,然后在完成后覆盖原始文件。几乎可以肯定,您最好只编写一个 awk 脚本来一次性完成所有更改。
  • 你能举一个独立的例子吗?我在想可能是一个使用例如的 bash 脚本。 seq 生成一个合适的输入文件,然后运行你的(可能简化的)sed 命令?如果您随后证明您的结果与预期有何不同,我们或许可以提供帮助。

标签: linux ubuntu sed


【解决方案1】:

又快又脏(不检查是否创建了修改文件,...)

sed

  • 假设您的模式列表中没有特殊的元字符

sed 's#.*#/&/{N;d;}#' YourListToExclude > /tmp/exclude.sed sed -f /tmp/exclude.sed YourDataFile > /tmp/YourDataFile.tmp mv /tmp/YourDataFile.tmp YourDataFile rm /tmp/exclude.sed

awk

awk 'FNR==NR{ex=(ex==""?"":ex"|")$0;next}$0!~ex{print;getline;print;next}{getline}' YourListToExclude YourDataFile > /tmp/YourDataFile.tmp
mv /tmp/YourDataFile.tmp YourDataFile

【讨论】:

    猜你喜欢
    • 2021-07-21
    • 2011-09-29
    • 2018-03-26
    • 1970-01-01
    • 2020-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多