将CSV文件按一列排序,允许在另一列中指定数量的重复项

时间:2014-05-23 17:43:30

标签: shell csv awk grep

我的文件包含全球约23,000个城市的以下信息:

人口:国家代码:城市:大陆

20470:ZM:Samfya:Africa
20149:ZM:Sesheke:Africa
18638:ZM:Siavonga:Africa
26459:ZW:Beitbridge:Africa
37423:ZW:Bindura:Africa
699385:ZW:Bulawayo:Africa
47294:ZW:Chegutu:Africa
61739:ZW:Chinhoyi:Africa
18860:ZW:Chipinge:Africa
28205:ZW:Chiredzi:Africa

我想只保留每个国家中包含四个最大城市(按人口)的行。 我想也许我可以按人口排序,然后在第二列中只允许一定数量的重复 - 后一部分是我无法弄清楚的。

我是否可以通过某种方式实现此目的AWK / grep的/ SED /排序?

2 个答案:

答案 0 :(得分:1)

这是从过度复杂的解决方案到Vytenis的重写解决方案。

sort -t: -k1rn file | awk -F: 'count[$2]++<5'
699385:ZW:Bulawayo:Africa
61739:ZW:Chinhoyi:Africa
47294:ZW:Chegutu:Africa
37423:ZW:Bindura:Africa
28205:ZW:Chiredzi:Africa
20470:ZM:Samfya:Africa
20149:ZM:Sesheke:Africa
18638:ZM:Siavonga:Africa

答案 1 :(得分:0)

打印排序结果:

sort -t: -k1rn  | awk -F: '{count[$2]++; print count[$2]":"$0}' | awk -F: '$1<5' | cut -d: -f 2-