• ベストアンサー

bshスクリプト で質問です。

以下の内容のtmp.txtを aaa bbb ccc ddd eee fff 行末がbbbなら結合としたいです。 --希望結果-- aaa bbb ccc ddd eee fff この場合以下のスクリプトでうまくいかないのですが 原因を教えていただけますか? awk '{ gsub("bbb[\n]$","",$0); print }' tmp.txt OS、HP-UX11.0です。

質問者が選んだベストアンサー

  • ベストアンサー
  • Lean
  • ベストアンサー率72% (435/603)
回答No.2

>awk '{ >gsub("bbb[\n]$","",$0); >print >}' tmp.txt 入力レコードセパレータは指定しないと改行文字(\n)であり$0には改行文字は含まれないのでgsub()で一致する事はない。 仮にgsub()で一致してもbbbを削除するような書き方になっている。 print文の出力レコードセパレータは指定しないと改行文字(\n)なので必ず改行され、そのままでは文末にbbbがあった行とその次の行をつなげることが出来ない。 とりあえずawkで考えてみました。 (HP-UXで動作するか否かは確認していませんが、特別な事をやっているわけではないので動作するとは思います。) awk '{match($0,/bbb$/)?ORS=" ":ORS="\n";print}' tmp.txt 各レコード(行)の出力はprint文です。 ただ、文末にbbbがある行の場合にはprint文の出力レコードセパレータ(ORS)を" "(1文字半角スペース)に設定し、それ以外の場合にはprint文の出力レコードセパレータ(ORS)をデフォルトの改行文字(\n)設定しprint文でレコード(行)を出力しています。 ちなみに文末にbbbbとかbbbbbとかでも次の行をつなげるようになっていますが。 文末がbbbの時だけなら awk '{match($0,/ bbb$/)?ORS=" ":ORS="\n";print}' tmp.txt かな? まあ、参考程度ということで。

lts107
質問者

お礼

>入力レコードセパレータは指定しないと改行文字(\n) >であり$0には改行文字は含まれないのでgsub()で一致 >する事はない。 >仮にgsub()で一致してもbbbを削除するような書き方 >になっている。 浅はかな知識で書いているもので知りませんでした。 大変役にたちました。ありがとうござました。

その他の回答 (1)

noname#29127
noname#29127
回答No.1

うまくいかないのは、改行ありのprint文をつかっているからかも しれません。改行がないprintfの使用で下記のようなやりかたはいかが でしょうか? cat DATA.txt | awk '{printf $0;printf " ";if($NF!="bbb")print ""}' 一番右端のデータがbbbでない時だけprint文で改行をいれています。 http://homepage2.nifty.com/mozu/koza/awk_koza/awk_koza_05.html

lts107
質問者

お礼

シンプルで分かりやすいです。 ありがとうございました。

関連するQ&A