【问题标题】:Awk command has unexpected results when comparing two files比较两个文件时,awk 命令出现意外结果
【发布时间】:2019-12-21 05:18:33
【问题描述】:

我正在使用 awk 命令比较两个文件中的第一列。

我想取 file1 的 col1,如果 file2 的 col1 匹配,则更新最后一列中的“更新日期”。如果没有匹配项,我想将 file1 的整行附加到 file2 并将“更新日期”值也附加到该行。这是我当前使用的命令:

awk 'FNR == NR { f1[$1] = $0; next } 
    $1 in f1 { print; delete f1[$1] } 
    END { for (user in f1) print f1[user] }' file1 file2

文件1:

tnash,172.2,plasma-de+,serv01,datetimeNEW
jhwagner,169.4,plasma-de+,serv01,datetimeNEW
steadmah,161.1,plasma-de+,serv01,datetimeNEW
guillwt,158.3,plasma-de+,serv01,datetimeNEW
mwinebra,122.2,plasma-de+,serv01,datetimeNEW
jbomba,100.0,plasma-de+,serv01,datetimeNEW
mschrode,161.1,plasma-de+,serv01,datetimeNEW

文件2:

jbomba,114.0,plasma-de+,serv01,datetimeOLD
mschrode,104.0,plasma-de+,serv01,datetimeOLD
deleteme,192.0,random,serv01,datetimeOLD        #<---- Needs to be removed: WORKS!

预期输出:(顺序无关紧要)

tnash,172.2,plasma-de+,serv01,datetimeNEW
jhwagner,169.4,plasma-de+,serv01,datetimeNEW
steadmah,161.1,plasma-de+,serv01,datetimeNEW
guillwt,158.3,plasma-de+,serv01,datetimeNEW
mwinebra,122.2,plasma-de+,serv01,datetimeNEW
jbomba,100.0,plasma-de+,serv01,datetimeOLD      #<---- NEED THIS VALUE
mschrode,161.1,plasma-de+,serv01,datetimeOLD    #<---- NEED THIS VALUE

当前输出:(顺序无关)

tnash,172.2,plasma-de+,serv01,datetimeNEW
jhwagner,169.4,plasma-de+,serv01,datetimeNEW
steadmah,161.1,plasma-de+,serv01,datetimeNEW
guillwt,158.3,plasma-de+,serv01,datetimeNEW
mwinebra,122.2,plasma-de+,serv01,datetimeNEW
jbomba,100.0,plasma-de+,serv01,datetimeNEW      #<----WRONG OUTPUT
mschrode,161.1,plasma-de+,serv01,datetimeNEW    #<----WRONG OUTPUT

逻辑崩溃:

If $usr/col1 in file2 does NOT exist in file1
     remove entire line from file2
     (ex: line3 in file2, user: deleteme)
If $usr/col1 in file1 does NOT exist in file2
      append entire line to file2
      (ex: lines 1-5 in file1)

所以问题是,当两个文件之间存在匹配时,我需要保留来自 file2 的信息,而不是来自 file1 的信息。在上面的输出示例中,您会看到我需要保留 file2 中的 datetimeOLD 以及 file1 中的新信息。

【问题讨论】:

    标签: awk text-processing


    【解决方案1】:

    设置字段分隔符为逗号,先读取file2

    $ awk -F',' 'FNR==NR{a[$1]=$0;next} $1 in a{print a[$1];next} 1' file2 file1
    tnash,172.2,plasma-de+,serv01,datetimeNEW
    jhwagner,169.4,plasma-de+,serv01,datetimeNEW
    steadmah,161.1,plasma-de+,serv01,datetimeNEW
    guillwt,158.3,plasma-de+,serv01,datetimeNEW
    mwinebra,122.2,plasma-de+,serv01,datetimeNEW
    jbomba,114.0,plasma-de+,serv01,datetimeOLD
    mschrode,104.0,plasma-de+,serv01,datetimeOLD
    

    【讨论】:

    • 那行得通,只是好奇你如何能够如此减少 awk 命令。你能解释一下你和我相比的简化吗?
    • @colm Mine 先将file2 读入数组a 将第一列映射到整条记录,然后在读取file1 时,如果a 中存在第一列,则打印相应的记录来自file2(即a[$1]),否则打印当前记录。你的更长更复杂,因为它首先读取file1,这要求你在最后使用循环打印a 中留下的所有内容。希望这个解释清楚
    猜你喜欢
    • 1970-01-01
    • 2014-01-21
    • 1970-01-01
    • 2012-08-25
    • 1970-01-01
    • 1970-01-01
    • 2018-03-04
    • 2012-09-05
    • 2014-08-10
    相关资源
    最近更新 更多