删除文件中指定的特定行号的行

And*_*rej 4 sed awk text-processing

我有一个文本文件A,其中包含我想从文本文件中删除的行号B。例如,文件A.txt包含行

1
4
5
Run Code Online (Sandbox Code Playgroud)

和文件B.txt包含行

A
B
C
D
E
Run Code Online (Sandbox Code Playgroud)

结果文件应该是:

B
C
Run Code Online (Sandbox Code Playgroud)

当然,这可以手动完成

sed '1d;4d;5d' B.txt
Run Code Online (Sandbox Code Playgroud)

但我想知道如何在不手动指定行号的情况下做到这一点。

αғs*_*нιη 8

您也可以使用awk

awk 'NR==FNR { nums[$0]; next } !(FNR in nums)' linenum infile
Run Code Online (Sandbox Code Playgroud)

在特定情况下,当 'linenum' 文件可能为空时,awk 将跳过它,因此它不会打印整个 'infile' 行,要解决这个问题,请使用以下命令:

awk 'NR==FNR && FILENAME==ARGV[1]{ nums[$0]; next } !(FNR in nums)' linenum infile
Run Code Online (Sandbox Code Playgroud)

甚至更好(感谢Stéphane Chazelas):

awk '!firstfile_proceed { nums[$0]; next } 
     !(FNR in nums)' linenum firstfile_proceed=1 infile
Run Code Online (Sandbox Code Playgroud)