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 asorti
la 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 NF
una 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.