【问题标题】:awk script: check if all words(fields) from one file are contained in another fileawk 脚本:检查一个文件中的所有单词(字段)是否包含在另一个文件中
【发布时间】:2013-09-22 15:49:29
【问题描述】:

我是 awk 脚本的新手。 我想对两个文件 File1.txt 和 File2.txt 进行逐字(字段)比较。 这些文件包含一个列表 | (管道)分隔字段。

    File 1:
    -------------------
    aaa|bbb|ccc|eee|fff
    lll|mmm|nnn|ooo|ppp
    rrr|sss|ttt|uuu|vvv

    File 2: 
    -------------------
    aaa|bbb|ccc|eee|fff
    rrr|sss|ttt|uuu|vvv
    rrr|sss|ttt|uuu|uuu

我们比较同一行号。在这两个文件中。

两个文件的第 1 行中的字段匹配。

第 2 行中的所有字段 (lll, mmm, nnn, ooo, ppp) 与文件 2 第 2 行中的所有字段 (rrr, sss, ttt, uuu, vvv) 不匹配。类似地,第 5 字段 (vvv , uuu) 两个文件中的第 3 行不匹配。

因此行号。 2和线号。 3 应该得到 bash 的回应。

两个文件都将遵循一个顺序。

【问题讨论】:

    标签: bash unix awk compare


    【解决方案1】:

    这一行应该这样做:

    awk 'NR==FNR{a[FNR]=$0;next}a[FNR]!=$0' file1 file2
    

    输出:

    rrr|sss|ttt|uuu|vvv
    rrr|sss|ttt|uuu|uuu
    

    【讨论】:

      【解决方案2】:

      两个比较两个文件,最好使用已经内置的命令sdiff:

       sdiff File1 File2
      

      这将显示两个文件中不同的行。

      使用 awk。

      awk -F '|' 'NR==FNR{a[$0];next}!($0 in a){print $0}' file1 file2
      

      【讨论】:

      • 谢谢,但这将比较两行而不是每行中的一个字段。
      • awk one-liner 会将 file2 中的 line#2 与 file1 中的 line#1 进行比较。不是 OP 想要的。We compare the same line no. in both the files.
      • 谢谢我想要一个类似的东西,但我也想在每一行中逐个字段进行比较。所以如果一个字段不匹配,我可以说哪个字段不匹配。
      【解决方案3】:

      以下几行可以根据需要进行调整,像 perl 这样的另一种语言可能更合适

      i=1
      while read -r -u4 l1 || read -r -u5 l2; do
        if [[ $l1 != $l2 ]]; then
          echo "$i: $l1 != $l2"
        fi
        ((i+=1))
      done 4<file1 5<file2
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-02-10
        • 2012-06-03
        • 2014-04-21
        • 1970-01-01
        相关资源
        最近更新 更多