我知道它被多次询问......但我似乎无法弄清楚如何完成这个简单的任务。数据未排序。
E-J1-N4
D-J5-N7
F-J1-N5
E-J5-N8
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
?
一如既往,非常适合寻找!我也对其他解决方案持开放态度(awk
,python
)。
答案 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