Drucken der Häufigkeit der Spaltenanzahl über Zeilen in einer Textdatei

Drucken der Häufigkeit der Spaltenanzahl über Zeilen in einer Textdatei

Ich habe eine Datei, die so aussieht:

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

Ich möchte eine Ausgabe, die mir zeigt, dass es 4 Zeilen mit 1 Spalte, 3 Zeilen mit 4 Spalten, 1 Zeile mit 3 Spalten und 1 Zeile mit 9 Spalten gibt. Die Ausgabe sollte also lauten: Zeilen (Spalten)

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

in Anbetracht der Tatsache, dass meine tatsächlichen Daten sehr groß sind, haben Sie bitte einen Vorschlag? In der Zwischenzeit möchte ich, dass in der letzten Zeile (hier 9) die maximale Anzahl der Spalten und in der ersten Zeile der Ausgabe eine Mindestanzahl der Spalten angezeigt wird.

Antwort1

Wenn Sie eine aktuelle (> 4.0) Version von GNU awk haben:

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)

Antwort2

gaffenAnsatz (mithilfe asortider Funktion):

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

Die Ausgabe:

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

  • asorti(a,b)- ein Array nach Indizes sortieren

Antwort3

Wenn Sie jede Zelle in Ihrer Tabelle als Platzhalter behandeln, um das gewünschte Ergebnis zu erzielen, können Sie doppelte Zeilen sortieren und zählen, um zu ermitteln, wie viele Zeilen die gleiche Anzahl an Spalten aufweisen.

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

Und anschließend können Sie die Wörter jeder Zeile zählen, um zu ermitteln, wie viele Spalten die Reihe hat.

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

Antwort4

Die einfachste Version ist

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

Es verwendet einfach NFeine Variable, die die Anzahl der Felder in der Zeile angibt, und aktualisiert den entsprechenden Wert, der damit im Wörterbuch verknüpft ist. Am Ende des Streams iteriert es dann einfach über alle Schlüssel des Wörterbuchs und druckt sie im angeforderten Format aus.

verwandte Informationen