我有一个使用命令 | sort | uniq -c 生成的文件
city.txt
2 mumbaiXa
3 mumbaiXb
1 mumbaiXp
5 delhiXn
4 delhiXz
1 parisXs
7 parisXt
1 parisXa
9 parisXe
我试图按 X 进行拆分并获取每个城市的数量:
expected output:
mumbai 6
delhi 9
paris 18
我尝试过这个,但没有得到预期的结果。
grep 'X' city.txt | awk '{print $2}' | awk -F 'X' '{print $1}' | sort | uniq -c
更新:
数据文件看起来像这样...
1904 mumbaiXa
1167 mumbaiXa
830 mumbaiXb
565 mumbaiXp
424 delhiXn
423 delhiXz
我给出了一个简化版本并更改了文本。
如果你被允许再次调用命令,并且它会给出完全相同的输出,那么你可以通过删除 X 及其后面的内容来获得所需的总数,然后将其塞入以下命令中,这可以按照以下方式完成,例如
否则,如果你想使用
... | sort | uniq -c
你应该重复cityname 次数量,让city.txt
内容然后
给出输出
解释:对于每一行,用 X 替换后跟零个或多个任意字符,我都会
for
循环到print
第二个字段,次数在第一个字段中指定。您可以通过在单个 Awk 脚本中实现所有内容来避免无用和其他相关的低效率。
grep
这里的关键变化是替换密钥中的
sub
所有内容;但希望周围的重构也是有用的。X
演示:https://ideone.com/8fvpgw
如果您的城市名称可以包含空格,也许可以使用
substr($0, length($1)+2)
而不是$2
。演示:https://ideone.com/G4ZwJR
用 Awk 关联数组替换
sort | uniq -c
是一种非常常见且基本的用法;如果您正在使用 Awk,那么花半个小时学习教程是值得的。您可以使用 Ruby 替换整个管道:
印刷:
如果您希望格式类似:
印刷:
或者按照您原始示例的顺序,并在表格中:
印刷:
使用任何 awk,给定按城市分组的输入作为示例:
或者如果您愿意(或者您的输入未分组并且由于某种原因您不想先对其进行排序):