【问题标题】:print unique lines based on field根据字段打印唯一行
【发布时间】:2015-01-08 03:25:21
【问题描述】:

希望根据第一个字段打印唯一行,保留该行的第一次出现并删除重复的其他出现。

输入.csv

10,15-10-2014,abc
20,12-10-2014,bcd
10,09-10-2014,def
40,06-10-2014,ghi
10,15-10-2014,abc

期望的输出:

10,15-10-2014,abc
20,12-10-2014,bcd
40,06-10-2014,ghi

已尝试以下命令且不完整

awk 'BEGIN { FS = OFS = "," }  { !seen[$1]++ } END { for ( i in seen) print $0}' Input.csv

寻找您的建议...

【问题讨论】:

    标签: awk


    【解决方案1】:

    语法有错别字。

    awk '{ if (!($1 in a)) a[$1] = $0; } END { for (i in a) print a[i]}'

    【讨论】:

      【解决方案2】:

      这应该给你你想要的:

      awk -F, '{ if (!($1 in a)) a[$1] = $0; } END '{ for (i in a) print a[i]}' input.csv
      

      【讨论】:

      • 它将根据要求生成唯一的输出,但由于in 运算符,它会打乱输出行的顺序,并且它比惯用的 awk 方法编码更多(请参阅我的答案)。
      【解决方案3】:

      您将“seen”的测试放在脚本的操作部分而不是条件部分。将其更改为:

      awk -F, '!seen[$1]++' Input.csv
      

      是的,这就是整个脚本:

      $ cat Input.csv
      10,15-10-2014,abc
      20,12-10-2014,bcd
      10,09-10-2014,def
      40,06-10-2014,ghi
      10,15-10-2014,abc
      $
      $ awk -F, '!seen[$1]++' Input.csv
      10,15-10-2014,abc
      20,12-10-2014,bcd
      40,06-10-2014,ghi
      

      【讨论】:

      • @AVN - 你应该勾选这个答案,这样它就会被“回答”。
      • @MichaelChaney 将问题标记为已回答总是好的策略,但我总是建议您等待一个小时,可能会有更好的答案。但我在这里怀疑:)
      • @Jotne 同意,但在这种情况下,不太可能出现更好的答案。我有很多答案,原来的提问者修改了答案,用“谢谢”评论,但显然不知道复选标记的用途。只是确保 Ed 在这里得到他的观点,因为他们是当之无愧的。
      • 我正在慢慢了解“AWK 编程语言”,但有人可以在这里添加解释吗?为什么没有牙套?打印语句在哪里?谢谢,如果这是相当基本的,我们深表歉意。我的书还不是很远
      • @Ben 如果没有花括号,则默认操作是在模式匹配时打印整行。如果$1 尚未添加到关联数组中,则模式!seen[$1]++ 将为真,否则为假。所以它会在第一次看到$1 时打印每一行。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-02-17
      • 1970-01-01
      • 1970-01-01
      • 2016-01-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多