プロが教えるわが家の防犯対策術!

以下の内容の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です。

A 回答 (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

かな?
まあ、参考程度ということで。
    • good
    • 0
この回答へのお礼

>入力レコードセパレータは指定しないと改行文字(\n)
>であり$0には改行文字は含まれないのでgsub()で一致
>する事はない。
>仮にgsub()で一致してもbbbを削除するような書き方
>になっている。

浅はかな知識で書いているもので知りませんでした。
大変役にたちました。ありがとうござました。

お礼日時:2006/08/10 13:23

うまくいかないのは、改行ありのprint文をつかっているからかも


しれません。改行がないprintfの使用で下記のようなやりかたはいかが
でしょうか?


cat DATA.txt | awk '{printf $0;printf " ";if($NF!="bbb")print ""}'


一番右端のデータがbbbでない時だけprint文で改行をいれています。

http://homepage2.nifty.com/mozu/koza/awk_koza/aw …
    • good
    • 0
この回答へのお礼

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

お礼日時:2006/08/10 13:21

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!