【问题标题】:Output the first duplicate in a csv file输出 csv 文件中的第一个副本
【发布时间】:2013-02-23 11:33:39
【问题描述】:

如何输出 csv 文件的第一个副本? 例如,如果我有:

00:0D:67:24:D7:25,1,-34,123,135  
00:0D:67:24:D7:25,1,-84,567,654  
00:0D:67:24:D7:26,1,-83,456,234  
00:0D:67:24:D7:26,1,-86,123,124  
00:0D:67:24:D7:2C,1,-56,245,134  
00:0D:67:24:D7:2C,1,-83,442,123  
00:18:E7:EB:BC:A9,5,-70,123,136  
00:18:E7:EB:BC:A9,5,-90,986,545  
00:22:A4:25:A8:F9,6,-81,124,234  
00:22:A4:25:A8:F9,6,-90,456,654  
64:0F:28:D9:6E:F9,1,-67,789,766  
64:0F:28:D9:6E:F9,1,-85,765,123  
74:9D:DC:CB:73:89,10,-70,253,777

我希望我的输出如下所示:

00:0D:67:24:D7:25,1,-34,123,135  
00:0D:67:24:D7:26,1,-83,456,234  
00:0D:67:24:D7:2C,1,-56,245,134  
00:18:E7:EB:BC:A9,5,-70,123,136  
00:22:A4:25:A8:F9,6,-81,124,234  
64:0F:28:D9:6E:F9,1,-67,789,766  
74:9D:DC:CB:73:89,10,-70,253,777

我正在考虑首先输出 csv 文件的第一行,就像awk (code that outputs first row) >> file.csv 然后将该行的第一个字段与下一行的第一个字段进行比较,如果它们相同,请检查下一个排。直到出现新行,代码将再次输出新的不同行awk (code that outputs) >> file.csv,它将重复直到检查完成

我对 bash 编码有点陌生,但到目前为止我很喜欢它,我目前正在编写一个 csv 文件,我需要一些帮助。谢谢大家

【问题讨论】:

    标签: bash sorting csv awk duplicates


    【解决方案1】:

    使用 awk:

    awk -F, '!a[$1]++' file.csv
    

    awk 形成一个数组,其中第一列是键,值是 no 的计数。特定键出现的次数。 '!a[$1]++' 仅在第一列第一次出现时为真,因此该行的第一次出现被打印。

    【讨论】:

      【解决方案2】:

      如果我理解你的意思,你想要这样的东西:

      prev_field=""
      while read line
      do
        current_field=$(echo $line | cut -d ',' -f 1)
        [[ $current_field != $prev_field ]] && echo $line
        prev_field=$current_field
      done < "stuff.csv"
      

      stuff.csv 是您的文件名。这是假设您尝试做的是获取 csv 行中的第一个字段并仅打印它的第一个唯一匹配项,如果是这种情况,我认为您的输出可能会丢失一些。

      【讨论】:

      • 哦,是的,我错过了一些,但这正是我所需要的,我将如何输出这个新的编译列表?我假设我不能在代码中的任何位置粘贴 > newStuff.csv
      • @user2143205 您可以简单地运行脚本并将输出重定向到像bash script.sh &gt; newStuff.csv 这样的文件。我倾向于这样做,因为它在数据最终的位置上更加灵活。换句话说,您可以在输出上执行 bash script.sh | grep "something" 和 grep 之类的操作。
      • 好吧,没关系,我在done &lt; "stuff.csv" 之后卡住了&gt; newStuff.csv,它起作用了。谢谢
      【解决方案3】:

      使用 uniq:

      sort lines.csv | uniq -w 17
      

      如果您的第一列是固定大小 (17)。 lines.csv 是一个包含您原始输入的文件。

      【讨论】:

        【解决方案4】:
        perl -F, -lane '$x{$F[0]}++;print if($x{$F[0]}==1)' your_file
        

        如果您想就地更改文件:

        perl -i -F, -lane '$x{$F[0]}++;print if($x{$F[0]}==1)' your_file
        

        【讨论】:

          猜你喜欢
          • 2021-11-02
          • 1970-01-01
          • 2014-12-10
          • 1970-01-01
          • 2012-06-22
          • 2020-10-26
          • 2021-04-30
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多