如何对sort|uniq -c输出的文件按城市汇总计数?
问题描述
我有一个通过command | sort | uniq -c生成的文件city.txt,实际内容如下:
1904 mumbaiXa 1167 mumbaiXa 830 mumbaiXb 565 mumbaiXp 424 delhiXn 423 delhiXz
我需要按字符X拆分每行的第二个字段,统计每个城市对应的数字总和,预期输出类似:
mumbai 4466 delhi 847
尝试执行以下命令但未得到预期结果:
grep 'X' city.txt | awk '{print $2}' | awk -F 'X' '{print $1}' | sort | uniq -c
错误原因分析
你之前的命令逻辑有误:
- 该命令仅提取了城市名,然后用
sort | uniq -c统计城市名出现的次数,而非累加每行开头的数字。比如mumbaiXa出现2次,命令会把mumbai的计数算成2,而不是把1904和1167相加。
解决方案
使用awk直接完成拆分、累加和输出,一步到位:
awk '{split($2, city_part, "X"); total[city_part[1]] += $1} END {for (c in total) print c, total[c]}' city.txt
或者用字段分隔符简化写法:
awk -F'[ X]' '{total[$2] += $1} END {for (c in total) print c, total[c]}' city.txt
命令解释
- 遍历
city.txt的每一行:- 以空格和
X作为分隔符时,$1是每行开头的数字,$2是拆分后的城市名(比如mumbai)。 - 用数组
total存储每个城市的累加值,键为城市名,值为对应数字的总和。
- 以空格和
- 所有行处理完成后(
END块),遍历数组输出每个城市及其总计数。
内容的提问来源于stack exchange,提问作者shantanuo
相关产品推荐
相关产品推荐

