- ベストアンサー
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です。
- みんなの回答 (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 かな? まあ、参考程度ということで。
その他の回答 (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
お礼
シンプルで分かりやすいです。 ありがとうございました。
お礼
>入力レコードセパレータは指定しないと改行文字(\n) >であり$0には改行文字は含まれないのでgsub()で一致 >する事はない。 >仮にgsub()で一致してもbbbを削除するような書き方 >になっている。 浅はかな知識で書いているもので知りませんでした。 大変役にたちました。ありがとうござました。