Awk 根据字段打印唯一行

Awk 根据字段打印唯一行,awk,Awk,要基于第一个字段打印唯一的行,请保留该行的第一个匹配项,并删除重复的其他匹配项 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 期望输出: 10,15-10-2014,abc 20,12-10-2014,bcd 40,06-10-2014,ghi 试过下面的命令并完成 awk 'BEGIN { FS = OFS = "," } { !see

要基于第一个字段打印唯一的行,请保留该行的第一个匹配项,并删除重复的其他匹配项

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
期望输出:

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 -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

这将为您提供您想要的:

awk -F, '{ if (!($1 in a)) a[$1] = $0; } END '{ for (i in a) print a[i]}' input.csv
语法上有错别字

awk'{if(!(a中的$1))a[$1]=$0;}END{for(a中的i)打印a[i]}'


它将根据请求生成唯一的输出,但由于运算符中的
,它将扰乱输出行的顺序,并且它比惯用的awk方法(请参见我的答案)要多得多。@AVN-您应该勾选此答案,这样它将被“回答”。@MichaelChaney将问题标记为已回答始终是一个很好的策略,但我总是建议你等上一个小时,也许会有更好的答案。但我对此表示怀疑:)@Jotne同意,但在这种情况下,很难找到更好的答案。我有很多答案,最初的提问者修改了答案,并用“谢谢”进行了评论,但显然不知道复选标记是用来做什么的。只是确保Ed在这里得到他的观点,因为他们是当之无愧的。我正在慢慢地学习“AWK编程语言”,但有人能在这里补充解释吗?为什么没有牙套?打印报表在哪里?谢谢,如果这是很基本的,我道歉。我对这本书的了解不多yet@Ben如果没有大括号,默认操作是在模式匹配时打印整行。模式
!如果未将
$1
添加到关联数组,则SEED[$1]+
将为真,否则为假。因此,它将在第一次看到
$1
时打印每一行。