(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 c
To říká awk, aby uložil aktuální řádek do proměnné
a
, další řádek v proměnnéb
a další řádek za tím v proměnnéc
. -
print a,b,c
To říká awk, aby vytiskl
a
,b
ac
-
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' <filename
Toto čte z názvu souboru a zároveň převádí všechny čárky na nové řádky.
-
paste -d, - - -
Toto
paste
pro 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.