Unix - 複数行にまたがるレコードから改行文字を削除する必要がある

Unix - 複数行にまたがるレコードから改行文字を削除する必要がある

次のファイルがあります

"IN001~24Apr16~Hi,
what a way?
oh no!~
not here~"
"IN003~29Apr16~
what a way?
~oh no!
say again.
not again~"

次の形式で出力したいと思います。

"IN001~24Apr16~Hi,what a way?oh no!~not here~"
"IN003~29Apr16~what a way?~oh no!say again.not again~"

awkまたはsedを使用するすべてのソリューションを大歓迎です。

答え1

awk '{ printf "%s",$0 }; /"$/ { print ""; };' inputfile

入力行が二重引用符で終わる場合にのみ、出力に改行文字が表示されます。したがって、このawkコードは改行なしですべての入力行を出力します。次に、入力行が a で終わっていることを確認し、"そうであれば改行文字を出力します。

答え2

$ sed -n -e '/^"/{h;n;}' -e H -e '/"$/{g;s/\n//g;p;}' file
"IN001~24Apr16~Hi,what a way?oh no!~not here~"
"IN003~29Apr16~what a way?~oh no!say again.not again~"

このsedコマンドは...

  • /^"/{h;n;}":で始まるすべての行を予約済みスペース()にコピーしh、その中のすべての内容を上書きしてすぐに次の入力行(n)に移動します。

  • H:予約済みスペースに追加の行が追加されます。

  • /"$/{g;s/\n//g;p;}:行が"予約済みスペースで終わっている場合は、予約済みスペース()を取り、改行が削除されg(この改行は予約済みスペースに行が追加されたときに追加されます)、結果の文字列が印刷されます。

コマンドラインは次のように圧縮できます。

$ sed -n '/^"/{h;n;};H;/"$/{g;s/\n//g;p;}' file

関連情報