在unix中使用cut和grep命令

use*_*029 1 unix bash grep cut

我有一个文件(file1.txt)文本为:

aaa,,,,,
aaa,10001781,,,,
aaa,10001782,,,,
bbb,10001783,,,,
Run Code Online (Sandbox Code Playgroud)

我的file2内容是:

11111111
10001781
11111222
Run Code Online (Sandbox Code Playgroud)

我需要在file2中搜索file1的第二个字段,如果pattern匹配则从file1中删除该行.所以输出将是:

aaa,,,,,
aaa,10001782,,,,
bbb,10001783,,,,
Run Code Online (Sandbox Code Playgroud)

我可以使用grep和cut命令吗?

Joh*_*024 8

仅当第二个字段不在file2中时,才会从file1.txt打印行:

$ awk -F, 'FNR==NR{a[$1]=1; next;} !a[$2]' file2 file1.txt
aaa,,,,,
aaa,10001782,,,,
bbb,10001783,,,,
Run Code Online (Sandbox Code Playgroud)

这个怎么运作

这通过读取file2并跟踪关联数组中看到的所有行来工作a.然后,仅当第2列不在时,才会打印file1.txt中的行a.更详细:

  • FNR==NR{a[$1]=1; next;}

    阅读时file2,设置a[$1]1表示我们已经看到此行的值.然后我们指示awk跳过其余命令并重新开始next.

    此部分仅针对file2运行,因为file2首先在命令行中列出,并且FNR==NR仅在我们读取命令行中列出的第一个文件时才列出.这是因为FNR从当前文件NR读取的行数是到目前为止读取的总行数.这两个仅对第一个文件相同.

  • !a[$2]

    读取file1.txt时,a[$2]如果在file2中看到第2列,则求值为true.由于!是否定,因此!a[$2]在未见第2列时评估为真.当此计算结果为true时,将打印该行.

替代

正如Tom Fenech的评论中所建议的那样,这是一种相同的逻辑,表达方式略有不同:

$ awk -F, 'FNR==NR{a[$1]; next;} !($2 in a)' file2 file1.txt
aaa,,,,,
aaa,10001782,,,,
bbb,10001783,,,,
Run Code Online (Sandbox Code Playgroud)