从 Linux 中的文件中删除特定行号(作为变量传递)

从 Linux 中的文件中删除特定行号(作为变量传递)

我有两个文件。一个有行列表(我不需要)说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

相关内容