我有一个文件(file1.txt),文字为:
aaa,,,,,
aaa,10001781,,,,
aaa,10001782,,,,
bbb,10001783,,,,
我的文件2内容是:
11111111
10001781
11111222
我需要在file2中搜索file1的第二个字段,如果pattern匹配则从file1中删除该行。所以输出将是:
aaa,,,,,
aaa,10001782,,,,
bbb,10001783,,,,
我可以使用grep和cut命令吗?
答案 0 :(得分:7)
仅当第二个字段不在file2中时,才会打印file1.txt中的行:
$ awk -F, 'FNR==NR{a[$1]=1; next;} !a[$2]' file2 file1.txt
aaa,,,,,
aaa,10001782,,,,
bbb,10001783,,,,
这可以通过读取file2并跟踪关联数组a
中看到的所有行来实现。然后,仅当第2列不在a
中时,才会打印file1.txt中的行。更详细:
FNR==NR{a[$1]=1; next;}
在阅读file2
时,请将a[$1]
设置为1
,表示我们已看到此行的值。然后我们指示awk跳过其余命令并从next
行重新开始。
此部分仅针对file2运行,因为file2首先在命令行中列出,而FNR==NR
仅在我们读取命令行中列出的第一个文件时列出。这是因为FNR
是从当前文件读取的行数,NR
是到目前为止读取的行总数。这两个仅对第一个文件是相同的。
!a[$2]
当读取file1.txt时,如果在file2中看到第2列,则a[$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,,,,
答案 1 :(得分:1)
用grep洗脱
SELECT * from StudentDetails
但是,对于大文件,John1024的awk soulution会更快。