【问题标题】:How to remove duplicate comma separate strings using awk如何使用 awk 删除重复的逗号分隔字符串
【发布时间】:2015-08-24 21:24:03
【问题描述】:

我有一个这样的 csv 文件:(命名为 test2.csv)

lastname,firstname,83494989,1997-05-20,2015-05-07 15:30:43,Sentence Skills 104,Sentence Skills 104,Elementary Algebra 38,Elementary Algebra 38,Sentence Skills 104,Sentence Skills 104,Elementary Algebra 38,Elementary Algebra 38,

我想删除重复的条目

我得到的最接近的是以下 awk 命令

awk '{a[$0]++} END {for (i in a) print RS i}' RS="," test2.csv

它可以工作,但会导致新的问题,它将值乱序排列,如下所示:

,Elementary Algebra 38
,2015-05-07 15:30:43
,Sentence Skills 104
,FirstName
,LastName
,1997-05-20
,83494989

我需要保持它们所在的顺序并将它们保持在一行中(我可以解决行问题,但不知道如何解决顺序问题)

更新解决方案:

anubhava 的回答效果很好,我添加了一个关于从日期中删除时间的问题,Ed Morton 帮助解决了这个问题,这是完整的查询

awk 'BEGIN{RS=ORS=","} {sub(/ ..:..:..$/,"")} !seen[$0]++' test2.csv

【问题讨论】:

    标签: bash csv awk


    【解决方案1】:

    你可以只使用这个 awk:

    awk 'BEGIN{RS=ORS=","} !seen[$0]++' test2.csv
    lastname,firstname,83494989,1997-05-20,2015-05-07 15:30:43,Sentence Skills 104,Elementary Algebra 38,
    

    【讨论】:

    • 很棒,超级干净。我寻找其他方法来做到这一点,但它们看起来过于复杂。
    • 现在我需要弄清楚如何从一个日期中删除 24 小时时间。一直在尝试使用正则表达式和 sed,但似乎无法正常工作
    • @moore1emu 如果您使用的是 awk,您不需要/想要 sed 或 grep 或其他任何东西,因为 awk 可以在内部做任何其他工具可以做的有用的事情。在!seen 之前,您只需要{sub(/ ..:..:..$/,"")} 之类的东西。
    • 感谢 Ed Morton 的提示,我的 AwkFu 很弱,而且才刚刚开始,请查看子查询来解决这个问题
    【解决方案2】:

    实现同样目的的另一种方法

    逗号换行

    sed -e 's/,/\n/g'
    

    使用 sort -u 删除重复行

    sed -e 's/,/\n/g' | sort -u
    

    最后将新行替换回逗号

    sed -e 's/,/\n/g' | sort -u | 's/\n/,/g'
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-08-27
      • 2012-01-30
      • 2014-02-11
      • 2016-05-21
      • 1970-01-01
      • 2016-04-19
      • 1970-01-01
      相关资源
      最近更新 更多