-1

我有两个这样的文件;

文件 1
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。但没有什么能接近。请告诉正确的命令来执行此操作。

谢谢

4

4 回答 4

1

一种正确的方法是:

grep -vFf file2 file1 | sed 's|,cl_id.*$||'

于 2013-08-27T06:32:53.777 回答
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
于 2013-08-27T06:00:57.547 回答
0

这似乎是您想要做的并且可能有效地工作:

grep -Ff file2.txt file1.txt | cut -f1 -d,

首先,grep将行从file2.txt用作模式,并在 中找到匹配的行file1.txt。是将-F模式用作文字字符串而不是正则表达式,尽管它与您的示例无关紧要。

最后,cut从输出中获取第一列,,用作列分隔符,生成 IP 地址列表。

输出与您的示例不完全相同,但该示例无论如何都没有意义,因为它包含任何输入文件中都不存在的文本。不确定这是您想要的还是更多。

于 2013-08-27T06:20:59.640 回答
0

将这两个文件输入到 AWK 或 perl 中,使用字段分隔符=","。如果有两个字段,请将字段添加到字典/地图/两个数组/任何内容(“file1Lines”)。如果只有一个字段(这是文件 2),请将其添加到 set/list/array/whatever(“file2Lines”)。阅读所有输入后:

循环 file1Lines。对于每个元素,检查关键部分是否存在于 file2Lines 中。如果不是,则打印值部分。

于 2013-08-27T06:32:13.370 回答