• ベストアンサー

awkでデリミタを変更したいです。

以下のファイルtestを 1111:2222:3333:4444 5555:6666:7777:8888 ↓ 1111,2222,3333,4444 5555,6666,7777,8888 にしてみたいです。 awk -F":" 'BEGIN{OFS=","}{ print }' test などとためしてみたのですがうまくいきません。 ご教示下さい。内容はsedですぐできるんですね、、。

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

  • ベストアンサー
  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.3

#1の方の回答でキマリなんですが、 > awk -F":" 'BEGIN{OFS=","}{ print }' test > などとためしてみたのですがうまくいきません。 ちょと解説を。 OFSを設定するのは悪くないです。 問題は、OFSが使われるのは print $1, $2, $3 のようにしたときに、各要素の間になにを挟むのか ということに対してです。 print としたときに出力対象になるのは $0 です。 そしてそれは読んできたレコードそのものです。 #ここまでがうまく行かなかったわけ ところで、$0(や他の$数字のフィールド)を変更すると、 「レコードの再構築」ということが行われます。 このとき、レコード中のフィールドを区切るものとして OFSが使われるのです。 大抵のawkでは #1の例にあるように $1 = $1 で 上記のレコードの再構築が行われますが、 たまーに、これだとフィールドの変更だと みなしてくれないawkがありますのでご注意ください。

vivi0303
質問者

お礼

ありがとうございます。 とてもわかりやすかったです。

その他の回答 (2)

  • maura
  • ベストアンサー率46% (48/104)
回答No.2

print で改行をしないようにし、 最後のフィールドの時に改行するようにし それ以外は カンマを挟む。 awk -F: 'BEGIN{ORS=""}{for(i=1;i<=NF;i++){if( i == NF ){print $i"\n"} else {print $i","}}}' test 長いです

  • notnot
  • ベストアンサー率47% (4900/10358)
回答No.1

行を編集しないとだめです。 {$1=$1;print} とか。

vivi0303
質問者

お礼

なるほど。ありがとうございます。

関連するQ&A

専門家に質問してみよう