我有两个这样的文件;
File1中
114.4.21.198,cl_id=1J3W7P7H0S3L6g85900g736h6_101ps
114.4.21.205,cl_id=1O3M7A7Q0S3C6h85902g7b3h7_101pf
114.4.21.205,cl_id=1W3C7Z7W0U3J6795197g177j9_117p1
114.4.21.213,cl_id=1I3A7J7N0M3W6e950i7g2g2i0_1020h
文件2
cl_id=1B3O7M6C8T4O1b559i2g930m0_1165d
cl_id=1X3J7M6J0W5S9535180h90302_101p5
cl_id=1G3D7X6V6A7R81356e3g527m9_101nl
cl_id=1L3J7R7O0F0L74954h2g495h8_117qk
cl_id=1L3J7R7O0F0L74954h2g495h8_117qk
cl_id=1J3W7P7H0S3L6g85900g736h6_101ps
cl_id=1W3C7Z7W0U3J6795197g177j9_117p1
cl_id=1I3A7J7N0M3W6e950i7g2g2i0_1020h
cl_id=1Q3Y7Q7J0M3E62953e5g3g5k0_117p6
我想比较file1上但不存在于file2上的cl_id值,并打印出file1(IP地址)中的第一个值。
应该是这样的
114.4.21.198
114.4.21.205
114.4.21.205
114.4.21.213
114.4.23.70
114.4.21.201
114.4.21.211
120.172.168.36
我试过awk,grep diff,comm。但没有什么可靠的。请告诉正确的命令。
感谢
答案 0 :(得分:1)
一个正确的方法就是:
grep -vFf file2 file1 | sed 's|,cl_id.*$||'
答案 1 :(得分:0)
我看不出你的输出方式。 120.172.168.36来自哪里。 这是一个比较的解决方案
awk -F, 'NR==FNR {a[$0]++;next} !a[$1] {print $1}' file2 file1
114.4.21.198
114.4.21.205
114.4.21.205
114.4.21.213
答案 2 :(得分:0)
这看起来像你想要做的,并且可能有效地工作:
grep -Ff file2.txt file1.txt | cut -f1 -d,
首先,grep
将file2.txt
中的行用作模式,然后在file1.txt
中找到匹配的行。 -F
是将模式用作文字字符串而不是正则表达式,尽管它与您的样本无关。
最后,cut
从输出中获取第一列,使用,
作为列分隔符,生成IP地址列表。
输出与样本不完全相同,但样本无论如何都没有意义,因为它包含的文本不在任何输入文件中。不确定这是你想要的还是更多。
答案 3 :(得分:0)
将两个文件都装入AWK或perl,并使用字段分隔符=“,”。如果有两个字段,请将字段添加到字典/映射/两个数组/其他(“file1Lines”)。如果只有一个字段(这是文件2),则将其添加到set / list / array / whatever(“file2Lines”)。阅读完所有输入后:
循环遍历file1Lines。对于每个元素,检查关键部分是否存在于file2Lines中。如果没有,请打印值部分。