(7 jawaban)
Tutup 3 tahun yang lalu.
Saya ada cara untuk membagi satu baris menjadi beberapa baris dengan 3 kolom.
Karakter baris baru tidak ada di akhir semua baris dalam file.
Saya mencoba menggunakan awk, tetapi itu membagi setiap kolom menjadi satu baris, bukan 3 kolom di setiap baris.
awk '{ gsub(",", "n") } 6' filename
di mana filename
kontennya terlihat seperti:
A,B,C,D,E,F,G,H,I,J,K,L,M,N,O
Output yang diinginkan memiliki 3 kolom di setiap baris:
A,B,C
D,E,F
G,H,I
J,K,L
M,N,O
Jawaban yang Diterima:
Menggunakan 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
Cara kerjanya
-
-v RS='[,n]'
Ini memberitahu awk untuk menggunakan kemunculan koma atau baris baru sebagai pemisah record.
-
a=$0; getline b; getline c
Ini memberitahu awk untuk menyimpan baris saat ini dalam variabel
a
, baris berikutnya dalam variabelb
, dan baris berikutnya setelah itu di variabelc
. -
print a,b,c
Ini memberitahu awk untuk mencetak
a
,b
, danc
-
OFS=,
Ini memberitahu awk untuk menggunakan koma sebagai pemisah bidang pada output.
Menggunakan tr
dan paste
$ tr , 'n' <filename | paste -d, - - -
A,B,C
D,E,F
G,H,I
J,K,L
M,N,O
Cara kerjanya
-
tr , 'n' <filename
Ini dibaca dari nama file saat mengonversi semua koma ke baris baru.
-
paste -d, - - -
paste
. ini untuk membaca tiga baris dari stdin (satu untuk setiap-
) dan rekatkan bersama-sama, masing-masing dipisahkan dengan koma (-d,
).
Alternatif 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
Cara kerjanya
-
-v RS='[,n]'
Ini memberitahu awk untuk menggunakan kemunculan koma atau baris baru sebagai pemisah record.
-
printf "%s%s",$0,(NR%3?",":"n")
Ini memberitahu awk untuk mencetak baris saat ini diikuti dengan koma atau baris baru tergantung nilai nomor baris saat ini,
NR
, modulo 3.