Wie teilt man unter Linux Zeilen einer riesigen Datendatei basierend auf der Anzahl der darin enthaltenen Spalten auf?

Wie teilt man unter Linux Zeilen einer riesigen Datendatei basierend auf der Anzahl der darin enthaltenen Spalten auf?

Meine Datendatei sieht so aus:

1
2 4 5 6 7 19
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 die Zeilen mit mehr als 4 Spalten in kleinere Zeilen mit maximal 4 Spalten pro Zeile aufteilen. Daher sollte die Ausgabe folgendermaßen aussehen:

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

Irgendwelche Vorschläge? Bitte bedenken Sie, dass meine echte Datendatei riesig ist.

Antwort1

Mit awk:

awk '{ if(NF>4) for(i=5; i<=NF; i+=4) $i = "\n" $i } 1' file

Mit sed:

sed 's/ /\n/4;T;P;D' file

Mit perl:

perl -lpe '$c = 0; s/ /++$c % 4 ? " " : "\n"/goe' file

Ausgabe:

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

Antwort2

Der einfachste Ansatz wäre eine späte Zusammenführung oder eine Zipper-Methode. Gehen Sie davon aus, dass das letzte Zeichen jeder Zeile ein Leerzeichen ist. Teilen Sie Ihre Datei zunächst in zwei Teile auf, je nach den Spalten, die Sie ausschneiden möchten.

cut -d' ' -f1-4 file > file1
cut -d' ' -f5- file > file2

Zweitens führen Sie die Dateien per Late Merge zusammen und löschen Sie leere Zeilen.

paste -d'\n' file1 file2 | sed '/^$/d'

verwandte Informationen