(7 Antworten)
Vor 3 Jahren geschlossen.
Ich kann eine einzelne Zeile in mehrere Zeilen mit 3 Spalten aufteilen.
Neue Zeilenzeichen fehlen am Ende aller Zeilen in der Datei.
Ich habe versucht, awk zu verwenden, aber es teilt jede Spalte in eine Zeile statt in 3 Spalten in jeder Zeile.
awk '{ gsub(",", "n") } 6' filename
wobei filename
Der Inhalt sieht so aus:
A,B,C,D,E,F,G,H,I,J,K,L,M,N,O
Gewünschte Ausgabe hat 3 Spalten in jeder Zeile:
A,B,C
D,E,F
G,H,I
J,K,L
M,N,O
Akzeptierte Antwort:
Mit awk
$ awk -v RS='[,n]' '{a=$0;getline b; getline c; print a,b,c}' OFS=, filename
A,B,C
D,E,F
G,H,I
J,K,L
M,N,O
Wie es funktioniert
-
-v RS='[,n]'
Dies weist awk an, jedes Vorkommen von entweder einem Komma oder einem Zeilenumbruch als Datensatztrennzeichen zu verwenden.
-
a=$0; getline b; getline c
Dies weist awk an, die aktuelle Zeile in der Variablen
a
zu speichern , die nächste Zeile in der Variablenb
, und die nächste Zeile danach in der Variablenc
. -
print a,b,c
Dies weist awk an,
a
auszugeben ,b
, undc
-
OFS=,
Dies weist awk an, bei der Ausgabe ein Komma als Feldtrennzeichen zu verwenden.
Mit tr
und paste
$ tr , 'n' <filename | paste -d, - - -
A,B,C
D,E,F
G,H,I
J,K,L
M,N,O
Wie es funktioniert
-
tr , 'n' <filename
Dies liest aus Dateiname, während alle Kommas in Zeilenumbrüche umgewandelt werden.
-
paste -d, - - -
Diese
paste
um drei Zeilen von stdin zu lesen (eine für jeden-
) und fügen Sie sie zusammen, jeweils getrennt durch ein Komma (-d,
).
Alternatives awk
$ awk -v RS='[,n]' '{printf "%s%s",$0,(NR%3?",":"n")}' filename
A,B,C
D,E,F
G,H,I
J,K,L
M,N,O
Wie es funktioniert
-
-v RS='[,n]'
Dies weist awk an, jedes Vorkommen von entweder einem Komma oder einem Zeilenumbruch als Datensatztrennzeichen zu verwenden.
-
printf "%s%s",$0,(NR%3?",":"n")
Dies weist awk an, die aktuelle Zeile zu drucken, gefolgt von entweder einem Komma oder einem Zeilenumbruch, abhängig vom Wert der aktuellen Zeilennummer,
NR
, modulo 3.