Печать частоты количества столбцов в строках текстового файла

Печать частоты количества столбцов в строках текстового файла

У меня есть файл, который выглядит так:

1
2 4 5 6 
20
22
24 26 27 
29 30 31 32 34 40 50 56 58
234 235 270 500
1234 1235 1236 1237
2300

Я хочу получить вывод, показывающий, что есть 4 строки с 1 столбцом, 3 строки с 4 столбцами, 1 строка с 3 столбцами и 1 строка с 9 столбцами. Таким образом, вывод должен быть: строки (столбцы)

4 (1)
1 (3)
3 (4)
1 (9)

учитывая, что мои реальные данные огромны, есть какие-нибудь предложения, пожалуйста? Между тем, я хочу, чтобы максимальное количество столбцов отображалось в последней строке (здесь 9) и минимальное количество столбцов отображалось в первой строке в выводе.

решение1

Если у вас последняя (> 4.0) версия GNU awk:

gawk '
  {a[NF]++} 
  END {
    PROCINFO["sorted_in"]="@ind_num_asc"; 
    for (i in a) printf "%d (%d)\n", a[i], i;
  }' file
4 (1)
1 (3)
3 (4)
1 (9)

решение2

таращитьсяподход (с использованием asortiфункции):

awk '{a[NF]++}END{ asorti(a,b); for(i in b) printf("%d (%d)\n",a[b[i]],b[i]) }' file

Выход:

4 (1)
1 (3)
3 (4)
1 (9)

  • asorti(a,b)- сортировка массива по индексам

решение3

Если вы рассматриваете каждую ячейку в таблице как местозаполнитель для создания желаемого результата, то вы можете отсортировать и подсчитать повторяющиеся строки, чтобы определить, сколько строк имеют одинаковое количество столбцов.

a=$(sed 's/\([0-9]\+\)/1/g' file | sort | uniq -c)
dups=$( echo "$a" | cut -d' ' -f7 )

И после этого вы можете подсчитать количество слов в каждой строке, чтобы определить, сколько столбцов в строке.

words=$(echo "$a" | cut -d' ' -f8- | awk '{print NF}')
paste <(echo "$dups") <(echo "$words")
4       1
1       3
3       4
1       9

решение4

Самый простой вариант —

cat data.txt | awk '{counts[NF] += 1} END { for (row_count in counts) { printf "%d (%d)\n", counts[row_count], row_count; }'

Он просто использует NFпеременную, которая дает количество полей в строке и обновляет соответствующее значение, связанное с ней в словаре. Затем в конце потока он просто перебирает все ключи словаря и выводит их в запрошенном формате.

Связанный контент