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)
但我想知道如何在不手动指定行号的情况下做到这一点。
您也可以使用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)