【问题标题】:sorting and remove duplicate in unix from file从文件中排序和删除unix中的重复项
【发布时间】:2018-06-26 10:06:35
【问题描述】:

下面是我的输入文件,但我的实际输入有数百万条记录,

004,shan@gmail.com,TAT,0582,live,20180622 06:27:47
004,bb@gmail.com,TAT,0588,live,20180622 06:27:27
004,shan@gmail.com,TAT,0562,live,20180622 06:27:59
004,aa@gmail.com,TAT,0582,inlive,20180622 06:27:47
006,dd@gmail.com,TAT,0582,live,20180622 06:27:47
004,tr@gmail.com,TAT,0582,live,20180622 06:27:47

首先我想使用第二列(电子邮件)升序对上述文件进行排序, 其次,我想使用第 6 列(时间戳)按降序对其进行排序。 第三,我需要删除基于重复的第二列。

预期输出:

004,aa@gmail.com,TAT,0582,inlive,20180622 06:27:47
004,bb@gmail.com,TAT,0588,live,20180622 06:27:27
006,dd@gmail.com,TAT,0582,live,20180622 06:27:47
004,shan@gmail.com,TAT,0562,live,20180622 06:27:59
004,tr@gmail.com,TAT,0582,live,20180622 06:27:47

我尝试了什么,但我想在单个命令中完成所有操作,而不是使用不同的步骤,而且 -u 无法正确删除重复项?

sort -t$'," -k2 pp.txt > pp1.txt
sort -t$'," -k6 -r pp1.txt > pp2.txt
sort -t$'," -k2 -u pp2.txt > pp3.txthere

请帮忙

【问题讨论】:

    标签: bash shell unix ksh


    【解决方案1】:

    使用gnu awk,您可以在单个命令中执行此操作:

    awk -F, 'BEGIN{PROCINFO["sorted_in"] = "@ind_str_asc"}
    !($2 in ts) || $6 > ts[$2] { ts[$2]=$6; row[$2]=$0 }
    END { for (i in row) print row[i] }' file
    

    004,aa@gmail.com,TAT,0582,inlive,20180622 06:27:47
    004,bb@gmail.com,TAT,0588,live,20180622 06:27:27
    006,dd@gmail.com,TAT,0582,live,20180622 06:27:47
    004,shan@gmail.com,TAT,0562,live,20180622 06:27:59
    004,tr@gmail.com,TAT,0582,live,20180622 06:27:47
    

    条件!($2 in ts) || $6 > ts 有两个带有OR 子句的子条件。 第一个条件意味着如果$2 作为键不存在于名为ts 的数组中,第二个条件意味着如果存在$2,那么如果当前时间戳或$6 大于数组中存在的时间戳(因此允许我们在最终数组中存储相同值 $2 的最大时间戳)

    【讨论】:

    • 你能解释一下吗!($2 in ts) || $6 > ts [ $2]{ts[$2]=$6;行[$2]=$0 }
    • !($2 in ts) || $6 > ts 有 2 个带有 OR 子句的条件。第一个条件意味着如果$2 作为键不存在于名为ts 的数组中,第二个条件意味着如果存在$2,那么如果当前时间戳大于数组中存在的时间戳(因此允许我们存储最大时间戳$2的相同值
    • 您能否告诉我,在使用 sort 命令或 gnu awk 处理数百万条记录时,哪一个性能更快?
    • sort 单独不会给你输出,因为你会把它传送到awkuniq。这个gnu awk 是单个命令,所以我相信这会更快、更高效。
    【解决方案2】:

    你应该这样做:

    sort -t, -u -k2,2 pp.txt
    

    结果是:

    004,aa@gmail.com,TAT,0582,inlive,20180622 06:27:47
    004,bb@gmail.com,TAT,0588,live,20180622 06:27:27
    006,dd@gmail.com,TAT,0582,live,20180622 06:27:47
    004,shan@gmail.com,TAT,0582,live,20180622 06:27:47
    004,tr@gmail.com,TAT,0582,live,20180622 06:27:47
    

    【讨论】:

    • 嗨,感谢您的回复,但首先我想使用第二列(电子邮件)升序对上述文件进行排序,其次我想使用第 6 列(时间戳)按降序对其进行排序..然后想删除重复的
    【解决方案3】:

    您能否尝试关注一下,如果这对您有帮助,请告诉我。

    sort -t, -k2,2 -k6,6nr   Input_file | awk -F, '!a[$2]++'
    

    【讨论】:

    • @jcrshankar,请告诉我你的 tr 结果是如何在 shan 之前出现的?以及您所期望的,请告诉我,届时将尝试修复它。
    • @jcrshankar,因为你没有正确复制它'你错过了,试试完整的命令,让我知道好吗?我已经更新了。
    • @jcrshankar,我相信我的代码工作正常,请检查并确认一次。
    • 嗨 ravi,一切正常,但它没有按降序排列第 6 列。我希望最近的时间戳应该出现并且旧的时间戳应该被删除重复..我想保留 004,shan@gmail.com,TAT,0562,live,20180622 06:27:59
    • @jcrshankar,是的,语法是正确的,对你有用吗?
    【解决方案4】:

    GNU sort:

    sort -t, -k2,2 -k6,6nr -u pp.txt
    

    输出:

    004,aa@gmail.com,TAT,0582,inlive,20180622 06:27:47
    004,bb@gmail.com,TAT,0588,live,20180622 06:27:27
    006,dd@gmail.com,TAT,0582,live,20180622 06:27:47
    004,shan@gmail.com,TAT,0582,live,20180622 06:27:47
    004,tr@gmail.com,TAT,0582,live,20180622 06:27:47
    

    【讨论】:

      猜你喜欢
      • 2016-06-14
      • 2020-06-09
      • 1970-01-01
      • 2016-10-01
      • 2016-01-24
      • 2011-02-09
      • 1970-01-01
      • 2021-11-12
      • 2021-01-27
      相关资源
      最近更新 更多