【问题标题】:Bash: find duplicates within a column, remove rows based on comparison of another column [duplicate]Bash:在列中查找重复项,根据另一列的比较删除行[重复]
【发布时间】:2021-01-13 12:26:24
【问题描述】:

我有一个逗号分隔的文本文件(为了便于阅读,下面的示例中没有逗号)包含几列。

id               date
xyz_1567.n28     2017-08-09T18:36:38.000000Z
abc_2791.b87     2015-04-07T12:04:06.000000Z
xyz_1567.n28     2019-10-09T10:34:38.000000Z

每当“id”列有重复时,我们需要比较重复行的“日期”列,并删除日期较早的行。在上面的示例中,第一行和第三行共享相同的 'id' 值。第三行的日期晚于第一行的日期,因此将保留第三行。输出:

id               date
abc_2791.b87     2015-04-07T12:04:06.000000Z
xyz_1567.n28     2019-10-09T10:34:38.000000Z

使用 awk 或 sort 可以很容易地找到重复项,比较日期也不难。困难的部分是将两者结合起来——至少对我来说是这样。

【问题讨论】:

  • Finding duplicates could be achieved fairly easily with awk or sort, comparing dates isnt hard either 那么你能提供两者的模板代码吗?组合很容易awk '{if (length(arr[$1])) { if (greater_date(arr[$1], $2)) arr[$1]=$2; } else arr[$1]=$2 } END { for i in arr ....})。基本上保存当前值。检查以前的值是否存在,如果遇到新值,则更新是否更好的日期。

标签: linux bash csv awk


【解决方案1】:
sort -rk2 file | awk '!seen[$1]++'

按日期(第二列)对文件进行排序,然后删除重复项。这样您就可以保留第一列的最新唯一性。


或者使用一个 awk 脚本

awk 'NR==1{print;next} $2>a[$1] {a[$1]=$2} END {for (i in a) print i,a[i]}' file

【讨论】:

    【解决方案2】:

    这应该会给你想要的结果。请检查,这是没有 awk。

    head -1 1.txt > new_uniqfile.txt;  # to get the header
    #logic to get max value for a given id
    for item in `tail -n+2 1.txt|awk '{print $1}'|sort|uniq`;
    do 
    grep $item 1.txt|sort -rk1,2|head -1 >> new_uniqfile.txt;
    done
    
    #prints the content from new file with unique values
    cat new_uniqfile.txt
    

    【讨论】:

      猜你喜欢
      • 2018-12-01
      • 1970-01-01
      • 2018-05-27
      • 2019-03-19
      • 2016-07-11
      • 2020-06-22
      • 2021-02-09
      • 1970-01-01
      • 2014-07-23
      相关资源
      最近更新 更多