我有两个文件。一个有行列表(我不需要)说Seqlist
和其他文本文件(我打算从中删除那些相应的行)说ContentFile
$cat Seqlist
3
4
7
10
345
7000
67001
.....
我用了 :
$ while read A; do sed -e "$((A)d" ContentFile; done < Seqlist >OUTPUT
但我只删除了第三行号。其余行不会被删除。
答案1
d
在行号文件中的每个数字末尾添加 a会将其变成sed
从其输入中删除指定行的脚本。那么就很简单了:
$ sed -f lines_to_delete.sed file_with_lines.txt
该sed
脚本可以这样创建:
$ sed -e 's/$/d/' file_with_numbers.txt >lines_to_delete.sed
答案2
使用ed
:
printf "%s\n" $(printf "%sd\n" $(sort -rnu Seqlist)) w | ed ContentFile
这用于printf
构建命令列表(来自 Seqlist 的唯一的反向排序行号列表的行删除命令,以及将修改后的文件写回磁盘的“w”)以ed
用于编辑ContentFile
答案3
如果行号列表适合内存(但不一定是内容文件ed
),您可以执行以下操作
awk 'FNR==NR{n[$0];next} !(FNR in n)' Seqfile ContentFile
如果两个文件都很大(或者可能很大),并且 Seqfile 已排序
cat -n ContentFile | join -v2 -j1 Seqfile - | sed 's/^[0-9]* //'
答案4
问题是您的脚本在第一次通过 sed 运行整个文件,因此其他数字都不起作用。
最简单的解决方法是建立一个行列表并通过 sed 执行一次。
s=
while read a
do s="$s$a d;"
done < Seqlist
sed -e "$s" ContentFile >OUTPUT