#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