如何统计第一列中第二列内容的出现次数(支持动态列名)
问题描述
现有如下格式的文本文件:
col1 col2 Me apple You banana Me banana Me apple You banana Me coconut He coconut Me coconut
需要统计每一行第一列对象对应第二列内容的出现次数,期望输出结果:
Me has 2 apple You has 2 banana Me has 1 banana Me has 2 coconut He has 1 coconut
尝试过sort和uniq命令但未得到预期结果,且两列的列名是动态的(不固定为col1/col2),求解决方法。
解决方法
方法1:用awk直接统计(推荐)
awk处理这种键值对统计非常顺手,还能自动跳过表头:
awk 'NR>1 {count[$1,$2]++} END {for (key in count) {split(key, arr, SUBSEP); printf "%s has %d %s\n", arr[1], count[key], arr[2]}}' your_file.txt
NR>1:跳过第一行的表头count[$1,$2]++:把(第一列值,第二列值)作为唯一标识,累计出现次数END块:遍历所有统计结果,拆分标识后按要求的格式输出
如果需要输出顺序和示例一致(按第一列、第二列排序),可以加上排序步骤:
awk 'NR>1 {count[$1,$2]++} END {for (key in count) print key SUBSEP count[key]}' your_file.txt | sort | awk -F '\034' '{printf "%s has %d %s\n", $1, $3, $2}'
方法2:结合sort和uniq实现
之前用这两个命令没成功,大概率是没处理好表头和统计逻辑,试试这个组合:
tail -n +2 your_file.txt | sort | uniq -c | awk '{printf "%s has %d %s\n", $2, $1, $3}'
tail -n +2:先跳过第一行的表头sort:把相同的第一列 第二列组合排在一起uniq -c:统计每组的出现次数(次数会被放在行首)- 最后用awk调整输出格式,把次数移到中间,换成要求的句式
内容的提问来源于stack exchange,提问作者Saeed
相关产品推荐
相关产品推荐

