Bash脚本比较来自2个文件的值并从一个文件打印输出值

时间:2013-08-27 05:13:09

标签: bash awk diff comm

我有两个这样的文件;

  

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。但没有什么可靠的。请告诉正确的命令。

感谢

4 个答案:

答案 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,

首先,grepfile2.txt中的行用作模式,然后在file1.txt中找到匹配的行。 -F是将模式用作文字字符串而不是正则表达式,尽管它与您的样本无关。

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

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

答案 3 :(得分:0)

将两个文件都装入AWK或perl,并使用字段分隔符=“,”。如果有两个字段,请将字段添加到字典/映射/两个数组/其他(“file1Lines”)。如果只有一个字段(这是文件2),则将其添加到set / list / array / whatever(“file2Lines”)。阅读完所有输入后:

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