この質問にはすでに回答があります :複数列のテキストファイルを処理して別の複数列のテキストファイルを取得するにはどうすればよいですか?
(7つの回答)
3年前に閉鎖されました。
Linux
(7つの回答)
3年前に閉鎖されました。
1行を3列の複数行に分割する方法があります。
ファイル内のすべての行の最後に改行文字がありません。
awkを使用してみましたが、各行が3列ではなく、1行に分割されています。
awk '{ gsub(",", "n") } 6' filename
ここで、filename
のコンテンツは次のようになります:
A,B,C,D,E,F,G,H,I,J,K,L,M,N,O
必要な出力には、各行に3つの列があります:
A,B,C
D,E,F
G,H,I
J,K,L
M,N,O
承認された回答:
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
仕組み
-
-v RS='[,n]'
これにより、awkは、コンマまたは改行のいずれかをレコード区切り文字として使用するように指示されます。
-
a=$0; getline b; getline c
これは、現在の行を変数
a
に保存するようにawkに指示します。 、変数b
の次の行 、およびその次の行の変数c
。 -
print a,b,c
これは、awkに
a
を出力するように指示します 、b
、およびc
-
OFS=,
これは、出力のフィールド区切り文字としてコンマを使用するようにawkに指示します。
tr
の使用 およびpaste
$ tr , 'n' <filename | paste -d, - - -
A,B,C
D,E,F
G,H,I
J,K,L
M,N,O
仕組み
-
tr , 'n' <filename
これは、すべてのカンマを改行に変換しながらファイル名から読み取ります。
-
paste -d, - - -
この
paste
stdinから3行を読み取ります(-
ごとに1行) )そしてそれらを一緒に貼り付け、それぞれをコンマで区切ります(-d,
。
代替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
仕組み
-
-v RS='[,n]'
これにより、awkは、コンマまたは改行のいずれかをレコード区切り文字として使用するように指示されます。
-
printf "%s%s",$0,(NR%3?",":"n")
これは、現在の行番号の値
NR
に応じて、現在の行の後にコンマまたは改行を続けるようにawkに指示します。 、モジュロ3。