予期しない改行を含むcsvファイルがあります。ファイルはおおよそ次のようになります。
col1; col2; col3; col4
1a; 1b; 1c; 1d
2a; 2b; 2c
;2d # this should be in the row above
3a; 3b; 3c; 3d
;
前の行から始めて各行をリンクしてから削除したいと思います。どうすればいいですか?
答え1
$ sed -e '
:loop
$!N
s/\n;/;/
tloop
P;D
' file.csv
常にパターン空間に2本のラインを保持してください。次の行の先頭にセミコロンが表示されている場合は、改行文字を切り取り、ループバックして次の行をパターン空間に読み込みます。
次の行にセミコロンがない場合は、ループを終了して最初の改行文字まで印刷してからその部分を削除して返し、次の行をパターンスペースに追加します。
答え2
どうですか?アッ:
awk -F ';' '{while (NF < 4) {getline nextline; $0 = $0 nextline}} 1' file
答え3
次のsed
スクリプトが必要な場合があります。
sed -n '$p;N;s/[[:blank:]]*\n[[:blank:]]*;/;/;P;D' csv_file
故障説明:
$p; # at last line of stream, just print it
N; # append the next line from input so that we always consider two lines at a time ...
s/[[:blank:]]*\n[[:blank:]]*;/;/; # then replace `\n;` (and any leading and trailing blanks) with just `;`, and ...
P; # print only the _first_ of the two lines present in memory and ...
D # then delete it and read one new line if memory becomes empty
最初のコマンドは、$p
入力ラインの総数が奇数の場合にのみ実際に何かを印刷します。スクリプトの残りの部分は、入力ストリームのメモリに常に2行があることを保証するためです。