【问题标题】:How to print only words that doesn't match between two files? [duplicate]如何仅打印两个文件之间不匹配的单词? [复制]
【发布时间】:2020-10-29 14:30:21
【问题描述】:

文件1:

cat
dog
house
tree

文件2:

dog
cat
tree

我只需要打印: house

【问题讨论】:

  • diff FILE1 FILE2

标签: linux


【解决方案1】:
$ cat file1
cat
dog
house
tree

$ cat file2
dog
cat
tree

$ grep -vF -f file2 file1
house

-v 标志仅显示不匹配,-f 用于文件名用作过滤器,-F 用于完全匹配(不会因任何模式匹配而减慢速度)。

【讨论】:

    【解决方案2】:

    使用 awk

    awk 'FNR==NR{arr[$0]=1; next} !($0 in arr)' FILE2 FILE1
    

    首先使用 FILE2 中的单词构建一个关联数组,然后遍历 FILE1 并仅打印这些。

    使用comm

    comm -2 -3 <(sort FILE1) <(sort FILE2)
    

    -2 抑制 FILE2 独有的行,-3 抑制两者中的行。

    【讨论】:

      【解决方案3】:

      如果你只想要单词,你可以对文件进行排序,区分它们,然后使用sed 过滤掉 diff 的符号:

      diff <(sort file1) <(sort file2) | sed -n '/^</s/^< //p'
      

      【讨论】:

        【解决方案4】:

        这里是一个选项:

        awk 'NR==FNR { arr[$1]="1" } NR != FNR { if (arr[$1] == "") { print $0 } } ' file2 file1
        

        创建一个名为 arr 的数组,使用 file2 的内容作为索引。然后使用 file1,查看每个条目并检查数组 arr 中是否存在条目。如果没有,请打印。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-07-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-01-14
          相关资源
          最近更新 更多