如何统计文本首列元素出现次数并保留第二列信息?
需求与问题描述
输入文件内容如下:
a1 D1 b1 D1 c1 D1 a1 D2 a1 D3 c1 D3
需要统计第一列元素的出现次数,同时保留第二列信息,以下两种输出格式均可接受:
可选输出1
3 a1 D1,D2,D3 1 b1 D1 2 c1 D1,D3
可选输出2
3 a1 D1 1 b1 D1 2 c1 D1 3 a1 D2 3 a1 D3 1 c1 D3
尝试用sort -k 1 input | uniq -c <keep col2>组合命令和awk工具均未成功,寻求可行实现方案。
可行实现方案
实现可选输出1(聚合第二列)
用awk可直接完成,无需额外排序(若不需要输出按第一列排序),命令如下:
awk '{count[$1]++; vals[$1] = vals[$1] (vals[$1] ? "," : "") $2} END {for (key in count) print count[key], key, vals[key]}' input
若需要输出按第一列排序,追加sort -k2即可:
awk '{count[$1]++; vals[$1] = vals[$1] (vals[$1] ? "," : "") $2} END {for (key in count) print count[key], key, vals[key]}' input | sort -k2
实现可选输出2(每条记录带总次数)
先用awk统计第一列的总次数,再遍历原文件输出每条记录加对应次数:
awk 'NR==FNR{count[$1]++; next} {print count[$1], $0}' input input
若需要输出按第一列排序,追加sort -k2:
awk 'NR==FNR{count[$1]++; next} {print count[$1], $0}' input input | sort -k2
内容的提问来源于stack exchange,提问作者Gero
相关产品推荐
相关产品推荐

