вывести большинство повторяющихся чисел из второго поля

С timeoutиз GNU Coreutils:

while : ; do 
  timeout 20h yourcommand 
  sleep 5
done
0
03.05.2020, 14:53
2 ответа

Учитывая данные вашего вопроса в файле с именемfile:

$ awk '{ print $2 }' <file | sort | uniq -c | sort -rn | head -n 20
  23 36141
   9 36280

В приведенных данных есть только два уникальных числа во втором поле (36141 встречается 23 раза, а 36280 встречается 9 раз ).

Конвейер извлекает второй столбец, используяawk(вместо этого используйте cut -f 2, если данные разделены табуляцией -). Затем этот список чисел сортируется и uniq -cподсчитывает, сколько раз встречается каждое число. sort -rnсортирует их по количеству в порядке от большего к меньшему, а последний head -n 20сокращает список до 20 уникальных номеров (только два числа уникальны в данных примера ).

1
28.04.2021, 23:16
awk '
  FNR==NR && NR<=20{ a[$2]; b[++cnt]=$2; next }
  $2 in a{
     if ($2 in c) c[$2]=c[$2] ORS $0 # append line to existing line(s)
     else c[$2]=$0                   # add first line
  }
  END{ for (i=1; i<=cnt; i++) print c[b[i]] }
' <(awk '{ print $2 }' file | sort | uniq -c | sort -rn) file

Замена процесса

  • awk:напечатать второе поле
  • sort:в этом примере не требуется, так как идентификаторы PID уже являются соседними, не уверен, что это всегда так
  • uniq:распечатать уникальный счетчик и PID
  • sort:обратный числовой (сначала самый высокий счет)

Основной сценарий

Использовать результат подстановки процесса (, ограниченный 20 строками, игнорировать счетчик )и исходный файл в качестве входных данных. Сохраните PID в двух массивах aи b, затем обработайте входной файл и сохраните нужные строки в массиве cи распечатайте их.

  • массивa:идентификаторы PID в качестве индексов, используемых для поиска
  • массивb:индекс для отображения PID для поддержания порядка на выходе
  • массивc:хранит строки для печати (PID как индекс)
1
28.04.2021, 23:16

Теги

Похожие вопросы