(7 odpovědí)
Uzavřeno před 3 lety.
Mám způsob, jak rozdělit jeden řádek na více řádků se 3 sloupci.
Na konci všech řádků v souboru chybí znaky nového řádku.
Zkoušel jsem použít awk, ale rozděluje každý sloupec jako jeden řádek namísto 3 sloupců v každém řádku.
awk '{ gsub(",", "n") } 6' filename
kde filename obsah vypadá takto:
A,B,C,D,E,F,G,H,I,J,K,L,M,N,O
Požadovaný výstup má 3 sloupce v každém řádku:
A,B,C
D,E,F
G,H,I
J,K,L
M,N,O
Přijatá odpověď:
Pomocí 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
Jak to funguje
-
-v RS='[,n]'To říká awk, aby jako oddělovač záznamů použil jakýkoli výskyt čárky nebo nového řádku.
-
a=$0; getline b; getline cTo říká awk, aby uložil aktuální řádek do proměnné
a, další řádek v proměnnéba další řádek za tím v proměnnéc. -
print a,b,cTo říká awk, aby vytiskl
a,bac -
OFS=,To říká awk, aby použil čárku jako oddělovač polí na výstupu.
Pomocí tr a paste
$ tr , 'n' <filename | paste -d, - - -
A,B,C
D,E,F
G,H,I
J,K,L
M,N,O
Jak to funguje
-
tr , 'n' <filenameToto čte z názvu souboru a zároveň převádí všechny čárky na nové řádky.
-
paste -d, - - -Toto
pastepro přečtení tří řádků ze stdin (jeden pro každý-) a vložte je dohromady, každý oddělený čárkou (-d,).
Alternativní 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
Jak to funguje
-
-v RS='[,n]'To říká awk, aby jako oddělovač záznamů použil jakýkoli výskyt čárky nebo nového řádku.
-
printf "%s%s",$0,(NR%3?",":"n")To říká awk, aby vytiskl aktuální řádek následovaný čárkou nebo novým řádkem v závislosti na hodnotě aktuálního čísla řádku,
NR, modul 3.