【问题标题】:Compare two files with awk or sed使用 awk 或 sed 比较两个文件
【发布时间】:2012-01-01 04:34:35
【问题描述】:

这对你来说一定很容易

这里是file1(一列)

1
2
3
4
5
6
7
8
9

这里是file2(两列)

2 yay
3 ups
4 wow
8 hey

必须有一个简单的行来打印 file1 中与 file2 不匹配的行

【问题讨论】:

  • 请注意,joincomm 解决方案需要对输入文件进行排序,它们恰好在这个问题中。 awk 解决方案不关心是否未排序。

标签: shell text sed awk


【解决方案1】:

您可以通过组合cutcomm 来做到这一点:

cut -d' ' -f1 file2 | comm -13 - file1

你也可以考虑join,这取决于你想如何处理重复的行。

【讨论】:

    【解决方案2】:
     awk 'NR==FNR{a[$1]++;next;}!($0 in a)' file2 file1
    

    或使用 -v 连接,正如@Michael 建议的那样:

    join -v1 file1 file2
    

    两者都会打印:

    1
    5
    6
    7
    9
    

    【讨论】:

    • 您能解释一下您的 awk 单行代码 +1 吗? :)
    • @Jaypal awk 将file2 保存在一个数组中,索引为field1;然后对于 file1 中的每一行检查它是否是数组的索引,以进行比较。 ++ 没什么特别的,只是为元素设置了一个值。一个[$1]=1;也可以。但 ++ 打字速度更快。 :)
    【解决方案3】:

    这个 sed 解决方案可能对你有用:

    { seq 1 10; echo -e "2 yay\n3 ups\n4 wow\n8 hey"; } | sort -n | 
    sed '1{h;d};H;${x;s/\(\S\+\)\n\1[^\n]*\n//g;p};d'
    1
    5
    6
    7
    9
    10
    

    解释:对文件进行数字排序,然后使用sed 将文件放入保存空间(HS)。在文件结束时交换到 HS,然后删除带有重复键的行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-12-16
      • 2017-01-31
      • 2018-03-04
      • 2017-07-25
      • 2014-10-12
      • 1970-01-01
      相关资源
      最近更新 更多