【问题标题】:Compare two files in linux?比较linux中的两个文件?
【发布时间】:2021-09-24 14:20:04
【问题描述】:

我有两个要比较的文件。文件 1.txt 和文件 2.txt。 File1.txt 看起来像:-

name1 12.12.365.237
name2 12.90.543.87
name3 34.47.26.230
name4 11.10.90.234
name5 10.11.12.15

而我的 file2 看起来像:-

10.11.12.15
12.12.365.237
11.10.90.234

我正在尝试编写一个脚本来识别 file1 中哪些 IP 地址在 file2 中不存在,并将名称和 IP 输出到单独的文件中并将其转换为 CSV。所以所需的输出将是:-

name2 12.90.543.87
name3 34.47.26.230  

我尝试像这样使用 grep :-

grep -Fxvf File2.txt File1.txt >> not-in-File2.txt

mv not-in-File2.txt not-in-File2.csv

但是 grep 命令似乎不起作用,因为它给出了错误的输出。它目前给了我整个 file1 的原样。

name1 12.12.365.237
name2 12.90.543.87
name3 34.47.26.230
name4 11.10.90.234
name5 10.11.12.15

比较这两个文件的最佳方法是什么?

【问题讨论】:

  • @markp-fuso 完成。

标签: linux bash


【解决方案1】:

您使用grep -x 的方法不起作用,因为它正在寻找完全匹配,而file1 有2 列,而file2 只有1 列。通过删除-x,它会给出输出,但会输出完整的行,而不仅仅是IP,例如:

grep -vwFf file2 file1

name2 12.90.543.87
name3 34.47.26.230

仅获取您必须使用的 IP:

grep -vwFf file2 file1 | cut -d ' ' -f2

-w 在这里非常重要,否则grep 不会检测到12.12.365.23712.12.365.23 之间的不匹配。


您可以使用awk 使用这个更好的解决方案:

awk 'FNR == NR {ips[$1]; next} !($2 in ips) {print $2}' file2 file1

12.90.543.87
34.47.26.230

【讨论】:

    【解决方案2】:

    OP 可能想要强制执行精确的 word 匹配而不是精确的 line 匹配,因此将 -x 替换为 -w(同样的事情 anubhava 已经提到):

    $ grep -Fwvf File2.txt File1.txt
    name2 12.90.543.87
    name3 34.47.26.230 
    

    【讨论】:

      猜你喜欢
      • 2015-04-12
      • 2013-01-08
      • 1970-01-01
      • 1970-01-01
      • 2023-02-04
      • 1970-01-01
      • 2015-04-14
      • 2012-06-15
      • 1970-01-01
      相关资源
      最近更新 更多