按出现次数对列进行排序

时间:2014-04-18 18:45:18

标签: sorting unix uniq

我有一些用标签分隔的数据

 8/1/12 15:22   622070509   Pig 123123123
 8/1/12 15:27   569038096   Monkey  123123123
 8/1/12 15:21   389549550   CatDog  123123
 8/1/12 15:26   558161100   Monkey  1231245
 8/1/12 15:28   274990777   CatDog  112312
 8/1/12 15:22   274990777   CatDog  12341

我想按出现次数对第四列进行排序,按降序排列,因此输出结果如下:

8/1/12 15:22    274990777   CatDog  12341
8/1/12 15:28    274990777   CatDog  112312
8/1/12 15:21    389549550   CatDog  123123
8/1/12 15:26    558161100   Monkey  1231245
8/1/12 15:27    569038096   Monkey  123123123
8/1/12 15:22    622070509   Pig 123123123 

到目前为止:

sort -t$'\t' -k4 file.txt

按字母顺序排序就好了,但是我没有看到按出现次数排序的参数。

3 个答案:

答案 0 :(得分:0)

学会以算法思考。您将如何手动处理数据?

  1. 计算第四列中每个值的出现次数,为您提供一对{Name,Count}。
  2. 使用{Name,Count}数据加入主数据,为您提供一个额外的列,告诉您出现次数。
  3. 按降序对递增数据进行排序,并按名称计算相同的数量。
  4. 从输出中删除Count列。
  5. 有一些Unix工具可以支持所有那些操作难度较大或较小的操作。确实,每个步骤都有多种方法。你可以用Perl或Python(或者确实是awk)来完成所有这些工作。或者您可以使用awkjoinsortsed分阶段进行此操作。

答案 1 :(得分:0)

cat infile.txt | awk -F \ t' {print $ 4}' | sort | uniq -c | sort -nr | awk {' print $ 2'} | xargs -I%grep%infile.txt> outfile.txt

答案 2 :(得分:-1)

您必须设置数字比较标志(-n):

sort -t$'\t' -k 4 -n file.txt

您还可以像这样定义第二个排序列:

sort -t$'\t' -k4n,4 -k3,3 file.txt

这将首先按数字排序第4列,当它找到相等的项目时,它将按字母顺序按第3列排序。