前の行に「|」を含まない行を追加します。

前の行に「|」を含まない行を追加します。

次の形式のデータを含むテキストファイルがあります。

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 

関連情報