【问题标题】:Keep only the line that is latest in the file and is a duplicate based on two fields仅保留文件中最新且基于两个字段重复的行
【发布时间】:2013-04-07 01:27:17
【问题描述】:

这与问题有关

我有一个这样的文件:

FOO,BAR,100,200,300
BAZ,TAZ,500,600,800
FOO,BAR,900,1000,1000
HERE,THERE,1000,200,100
FOO,BAR,100,10000,200
BAZ,TAZ,100,40,500

重复项由前两个字段确定。此外,更“最近”的记录(文件中较低的/较高的行号)是应该保留的记录。

什么是awk脚本会输出:

BAZ,TAZ,100,40,500
FOO,BAR,100,10000,200
HERE,THERE,1000,200,100

输出顺序不是那么重要。

awk 语法的解释会很棒。

【问题讨论】:

    标签: awk


    【解决方案1】:

    这在 中很容易:我们只需要提供一个带有键的数组,该键与第一列和第二列相结合,其余的作为值:

    $ awk -F, '{a[$1","$2]=$3","$4","$5}END{for(i in a)print i,a[i]}' OFS=, file.txt
    BAZ,TAZ,100,40,500
    HERE,THERE,1000,200,100
    FOO,BAR,100,10000,200
    

    【讨论】:

    • 您能否详细说明或链接到 awk 中数组的说明以及它们如何帮助解决此问题?
    • 关联数组本质上具有唯一键。这就是所有的魔法。由于我们只保留最新的值,我们只需要遍历行并@the end,逐行显示数组
    【解决方案2】:

    这可能对你有用(tac 和 GNU 排序):

    tac file | sort -sut, -k1,2
    

    【讨论】:

    • 好的,您演示了一个甚至不使用 awk 的解决方案,现在我知道了 tac 和一些不明显的 sort 选项。赢家。
    猜你喜欢
    • 2015-02-08
    • 2017-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多