在unix中使用cut和grep命令

时间:2015-06-08 07:02:32

标签: bash unix grep cut

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

aaa,,,,,
aaa,10001781,,,,
aaa,10001782,,,,
bbb,10001783,,,,

我的文件2内容是:

11111111
10001781
11111222

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

aaa,,,,,
aaa,10001782,,,,
bbb,10001783,,,,

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

2 个答案:

答案 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会更快。