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 asorti
der 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 NF
eine 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.