输入示例是
John,Yes,123
Tom,No,345
Jason,Yes,567
Thomas,No,123
Jess,No,999
James,Yes,888
Lisa,No,345
Lou,Yes,777
Peter,No,123
我想打印第三列中值的出现次数,但仅打印出现次数超过 1 次的值。因此,对于上面的示例,所需的输出将是:
3 123
2 345
我们如何用sed
/awk
或类似的东西做到这一点?
答案1
cut -f3 -d, "$file" | sort | uniq -cd | sed 's/ *//'
cut
使用逗号作为分隔符,仅输出第三个字段sort
对行进行排序以便uniq
可以使用uniq -c
计算有多少个连续的重复行,-d
使其仅输出重复项(即省略唯一值)- 最后一个
sed
删除了前导空格。
答案2
一行awk
:
awk -F',' '{c[$3]++} END{for (i in c) {if (c[i]>1) print c[i],i}}' input.csv
- 这指示
awk
用作,
字段分隔符。 - 对于每一行,它都会为第三个字段 ( ) 的值增加一个计数器
$3
。 - 最后,它将迭代计数器数组
c
(for (i in c)
) 中注册的所有“索引”,如果与该索引关联的“条目”大于 1,则打印出现次数和第三列的相应值。
如果您想更好地控制输出格式,您可能需要使用printf
而不是print
在块中END
。