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命令吗?
仅当第二个字段不在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)
归档时间: |
|
查看次数: |
1968 次 |
最近记录: |