从infile反向grep

时间:2012-01-12 20:16:16

标签: awk grep

我知道它被多次询问......但我似乎无法弄清楚如何完成这个简单的任务。数据未排序。

样本数据:

file_1

E-J1-N4  
D-J5-N7  
F-J1-N5  
E-J5-N8  

file_2

E-J5-N8  
F-J5-N2  
E-J1-N4  
D-J5-N7    
F-J1-N5  
F-J5-N1  
F-J5-N12  
F-J5-N3 
  

(我编辑数据以更好地反映我的实际数据集,似乎导致问题的是Nxx,N12在这里。正如他们所知,数据不容易排序,我知道我可以将所有数字格式化为N01 N02等......但如果我能避免这种情况,那就太好了。)

所以我只需要在file_2中打印不在file_1

中的$名称
grep -vf file_1 file_2  

不起作用。

for name in `file_1`; do grep -v $name file_2; done  

给了我大量的输出......(64个带有重复的#names)。没有-v flag的循环也不起作用,它会添加数据。 (wc -l不匹配)

那么,为什么grep -vf无效?这可能是一个排序问题吗?为什么循环不起作用,如果可以,我怎么能反转grep中的for loop

一如既往,非常适合寻找!我也对其他解决方案持开放态度(awkpython)。

4 个答案:

答案 0 :(得分:1)

使用awk的一种方式:

awk 'NR==FNR { a[$0]; next } !($0 in a)' file_1 file_2

结果:

F-J5-N2
F-J5-N3
F-J6-N1
F-J6-N2
F-J6-N3
F-J6-N4
F-J6-N5
F-J6-N6
F-J6-N7
F-J6-N8
F-J8-N1
F-J9-N1
F-J9-N2

答案 1 :(得分:1)

这样可行:

comm -1 -3 <(sort file_1) <(sort file_2)

测试:

[jaypal:~/Temp] comm -1 -3 <(sort file_1) <(sort file_2)
F-J5-N2
F-J5-N3
F-J6-N1
F-J6-N2
F-J6-N3
F-J6-N4
F-J6-N5
F-J6-N6
F-J6-N7
F-J6-N8
F-J8-N1
F-J9-N1
F-J9-N2

更新

[jaypal:~/Temp] cat ff1
E-J1-N4
D-J5-N7
F-J1-N5
E-J5-N8

[jaypal:~/Temp] cat ff2
E-J5-N8
F-J5-N2
E-J1-N4
D-J5-N7
F-J1-N5
F-J5-N1
F-J5-N12
F-J5-N3

[jaypal:~/Temp] comm -1 -3 <(sort ff1) <(sort ff2)
F-J5-N1
F-J5-N12
F-J5-N2
F-J5-N3

答案 2 :(得分:1)

此解决方案仅在file_2 中没有重复行且 file_1是file_2的子集时才有效:

sort file_[12] | uniq -u

说明:sort命令组合了两个文件,然后对它们进行排序。然后,uniq命令仅选择那些不重复的行,即file_2中的行,但不是file_1中的行。

请注意,如果将 -u 标志替换为 -d ,则输出将包含那些重复的行,这意味着出现在两个文件中。

答案 3 :(得分:1)

awk 'FNR==NR{a[$0];next}!($0 in a)' file_1 file_2