2015-12-10 36 views
-1

我有一个75000项目的文本文件,每个项目2行。第1行有一个标识符,第2行是一个文本字符串。 我需要删除130项,我有一个列表中的随机标识符或可以放在一个文件中。 我可以执行一个项目的删除,但不能超过一个。 我试着管道标识符并得到一个空的输出文件。 我试过sed -e 'expression' inputfile > outfile的重复命令。这会起作用,但需要一个新的输出文件,然后成为下一次迭代的输入文件等等。这可能是最后的手段。ubuntu linux sed影响文件属性?

我试过sed -i in iteration;这会崩溃,并且错误在于输入文件的名称没有文件。显然,情况并非如此,因为我可以看到这种情况,只需填写它并标识其中的标识符数量即可。只有sed似乎无法读取它。

我甚至在网上发现了一个python/biopython脚本,这个确切的问题很简单,并且不会给出错误消息,但它也只删除第一个项目。

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

+3

请为样本输入添加样本输入和您想要的输出到您的问题。 – Cyrus

+0

使用'-i'和命名你自己的tmp文件之间没有任何功能差异。在这两种情况下都会使用临时文件,只是在后者中您可以命名它。同上你选择使用的任何python脚本。没有真正的内嵌文件编辑的UNIX工具 - 即使是'ed'也使用内部缓冲区和原始文件的大小,然后在完成时覆盖原始文件。只需编写一个awk脚本来一次完成所有更改,你几乎肯定会更好。 –

+1

你可以举一个独立的例子吗?我在想可能是一个bash脚本,它使用例如'seq'生成一个合适的输入文件,然后运行你的(可能简化的)'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