Imprimir la frecuencia del número de columnas en filas en un archivo de texto

Imprimir la frecuencia del número de columnas en filas en un archivo de texto

Tengo un archivo que se parece a:

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

Quiero tener un resultado que me muestre que hay 4 filas con 1 columna, 3 filas con 4 columnas y 1 fila con 3 columnas y 1 fila con 9 columnas. Entonces, la salida debería ser: filas (columnas)

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

considerando que mis datos reales son enormes, ¿alguna sugerencia, por favor? Mientras tanto, quiero que el número máximo de columnas se muestre en la última fila (aquí 9) y que se muestre un número mínimo de columnas en la primera fila en la salida.

Respuesta1

Si tiene una versión reciente (> 4.0) de 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)

Respuesta2

papar moscasenfoque (usando asortila función):

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

La salida:

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

  • asorti(a,b)- ordenar una matriz por índices

Respuesta3

Si trata cada celda de su tabla como un marcador de posición para crear el resultado deseado, puede ordenar y contar líneas duplicadas para identificar cuántas líneas tienen la misma cantidad de columnas.

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

Y después de eso puedes contar las palabras de cada línea para identificar cuántas columnas hay en la fila.

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

Respuesta4

La versión más simple es

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

Simplemente utiliza NFuna variable que proporciona el número de campos en la línea y actualiza el valor relevante asociado a ella en el diccionario. Luego, al final de la secuencia, simplemente itera sobre todas las claves del diccionario y las imprime en el formato solicitado.

información relacionada