次の形式のデータを含むテキストファイルがあります。
1|0|this is test file line1
2|1|this is test file line2
3|1|this
is
test
file line4
含まない行は、含める|
前の行に追加する必要があります。|
出力:
1|0|this is test file line1
2|1|this is test file line2
3|1|this is test file line4
答え1
1つの方法は、awkを使用して次のアルゴリズムを実装することです。
- 前の行の追跡
prev
- 行にが含まれていて
|
最初の行ではない場合は、印刷してくださいprev
。その後、現在の行prev
- 行に含まれていない場合は、
|
次に追加します。prev
- スクリプトの最後に印刷
prev
たとえば、
awk '/\|/ { if (NR > 1) print prev; prev=$0 }
!/\|/ { prev = prev $0 }
END { print prev }' input
答え2
フィールド区切り文字として使用されます|
。行にaが含まれている場合、|
このNF
変数は1より大きくなります。
awk -F'|' 'NR > 1 && NF > 1 {print ""} {printf "%s", $0} END {print ""}' file
答え3
awk '/\|/ { if (printed==1) print ""; else printed=1;
printf "%s",$0; next; }; { printf " %s",$0 }; END { print ""; }' inputfile
あるいは、先行改行を気にしない場合は短い。
awk '/\|/ { printf "\n%s",$0; next; }; { printf " %s",$0 }; END { print ""; }' inputfile
答え4
awkもあります:
awk -F'|' 'NR>1{printf prev (NF>1?"\n":" ")}{prev=$0}END{print prev}' file
テスト
$ cat file1
1|1|this is test file line1
2|2|this is test file line2
3|3|this
is
test
file line3
4|4|this is test file line4
5|5|this is
test file
line5
6|6|this is test file line6
$ awk -F'|' 'NR>1{printf prev (NF>1?"\n":" ")}{prev=$0}END{print prev}' file1
1|1|this is test file line1
2|2|this is test file line2
3|3|this is test file line3
4|4|this is test file line4
5|5|this is test file line5
6|6|this is test file line6