сортировать файлы в порядке количества вхождений

#awk

#awk

Вопрос:

Есть текстовый файл:

 $ cat tempfile.txt
123
567
345
123
789
234
123
234
345
789
  

и мой желаемый результат следующий:

 123,3
789,2
345,2
  

Мне нужно отсортировать каждый (1) в порядке количества вхождений, и (2) когда номера вхождений одинаковы, сначала следует упорядочить файл с большим числовым значением, и (3) отображаются только верхние 3.

Я попробовал это:

 tr -c '[:alnum:]' '[n*]' < tempfile.txt | sort -nr | uniq -c | sort -nr | head  -3
  

Но это показывает только так:
Мне нужно поменять местами положение количества вхождений и цифр и разделить эти два через запятую, а когда число вхождений одинаковое, сначала отсортируйте большие числовые цифры.

 3 123
2 234
2 345
  

Комментарии:

1. Почему вы это делаете tr -c '[:alnum:]' '[n*]' ?

Ответ №1:

возьмите эту строку :

 sort tempfile.txt | uniq -c | sort -nr -k 1,1 -k 2,2 | awk '{print $2","$1; if (NR == 3) exit}'
  

это дает:

 123,3
789,2
345,2
  

Комментарии:

1. Я обнаружил, что этот код предполагает, что 8> 10. Есть ли какой-либо способ решить эту проблему?

2. я изменил параметры сортировки

Ответ №2:

Вы можете использовать обычную awk и сортировку по двум полям таким образом:

 $ awk '{arr[$1]  } 
            END{for (e in arr) print e "," arr[e]}' file | 
            sort -t , -k2rn -k1rn 
  

С принтами:

 123,3
789,2
345,2
234,2
567,1
  

Опять же, используйте head , чтобы получить желаемое количество значений.

Ответ №3:

В рамках одного GNU awk , не могли бы вы попробовать следующее.

 awk '
{
  a[$0]  
}
END{
  PROCINFO["sorted_in"] = "@val_num_desc"
  for(i in a){
    c[a[i]]=(c[a[i]]>i?c[a[i]]:i)
  }
  PROCINFO["sorted_in"] = "@ind_num_desc"
  for(o in c){
    print o,c[o]
  }
}' Input_file
  

Для предоставленных образцов вывод будет следующим.

 3 123
2 789
1 567
  

Объяснение: Добавление подробного объяснения выше.

 awk '                                        ##Starting awk program from here.
{
  a[$0]                                      ##Creating array a with index of current line and increasing its value with 1 here.
}
END{                                         ##Starting END block of this program from here.
  PROCINFO["sorted_in"] = "@val_num_desc"    ##Making gwk to sort from value in array gawk GREAT function :)
  for(i in a){                               ##Traversing through a here.
    c[a[i]]=(c[a[i]]>i?c[a[i]]:i)            ##Creating array c with index of value of a with condition if
                                             ##value of c(with index of a[i]) is greater than i then keep its value else assign i to it.
  }
  PROCINFO["sorted_in"] = "@ind_num_desc"    ##Making gawk to sort by index in array gawk another GREAT function :)
  for(o in c){                               ##Traversing through c here.
    print o,c[o]                             ##Printing index and value of c with index of o here.
  }
}' Input_file                                ##Mentioning Input_file name here.
  

Комментарии:

1. @ohlla, не могли бы вы, пожалуйста, проверить это тоже один раз, если это вам поможет?

Ответ №4:

Используйте эту команду, которая позволяет определенным образом управлять порядком сортировки:

 sort -g tempfile.txt | uniq -c | perl -lane 'print join "t", reverse @F;' | sort -k2,2gr -k1,1g | head -n3 | tr 't' ','
  

Вывод:

 123,3
234,2
345,2