使用其他文件中的行号从文本文件中删除行

jav*_*ity 5 linux string awk sed text-files

我有一个文本文件,其中包含一个巨大的行号列表,我必须从另一个主文件中删除.这是我的数据的样子

lines.txt

1
2
4
5
22
36
400
...
Run Code Online (Sandbox Code Playgroud)

documents.txt

string1
string2
string3
...
Run Code Online (Sandbox Code Playgroud)

如果我有一个简短的行号列表,我可以轻松使用

sed -i '1d,4d,5d' documents.txt.

但是我必须删除很多行号.另外,我可以使用bash/perl脚本将行号存储在数组中,并回显不在数组中的行.但我想知道是否有内置命令来做到这一点.

任何帮助将受到高度赞赏.

Ken*_*ent 10

awk oneliner应该适合你,请看下面的测试:

kent$  head lines.txt doc.txt 
==> lines.txt <==
1
3
5
7

==> doc.txt <==
a
b
c
d
e
f
g
h

kent$  awk 'NR==FNR{l[$0];next;} !(FNR in l)' lines.txt doc.txt
b
d
f
h
Run Code Online (Sandbox Code Playgroud)

正如Levon所说,我补充一些解释:

awk                     # the awk command
 'NR==FNR{l[$0];next;}  # process the first file(lines.txt),save each line(the line# you want to delete) into an array "l"

 !(FNR in l)'           #now come to the 2nd file(doc.txt), if line number not in "l",print the line out
 lines.txt              # 1st argument, file:lines.txt
 docs.txt               # 2nd argument, file:doc.txt
Run Code Online (Sandbox Code Playgroud)