• ベストアンサー

AWKで1項目以外を簡単に出力したい

awkのprint出力で$1$2$3$4$5$6と書くのではなく、$1から$6までを簡潔に指定できる方法はありませんか? (たとえば$1-$6のような) すべて出力したい場合は$0でいいのですが、1項目だけ除外してあとはすべて出力したい時に項目が多い大変ですから。

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

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

最後のフィールドだけ消せばいいのなら、組み込み変数NFをデクリメント してやればいいです。$7=""だと中身が空のフィールドになるだけなので 余計なセパレータが出力されるように見えているのです。 ひょっとしたらNFをデクリメントしたあとで$0の再構築を 強制的にさせる必要があるかもしれません($0=$0 とか $1=$1で やってくれるはず)。

ritomo
質問者

お礼

ありがとうございました。 awk 'BEGIN {FS="|"} {OFS="|"; $7=""; NF=6; print $0}' ./aaaaでうまくいきました。 $0の再構築は必要ないようです。 入力:111|222|333|444|555|666|777 出力:111|222|333|444|555|666 awk 'BEGIN {FS="|"} {OFS="|"; $7=""; NF=6; $0=$0; print $0}'./aaaa の場合は「awk: $0 の設定ができません」というエラーになるようです。 ちなみに途中の項目を抜くのはどんな方法を使えばよろしいのでしょうか? (たとえば、$3だけを抜かして表示) よろしかったら教えていただけないでしょうか?

その他の回答 (2)

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

詳しくは参考URLの先を読んでいただくとして、 あるフィールドを空文字列にすることはできますが、それは内容が 空のフィールドを作るだけで削除ではありません。 ですので、ご希望のような途中のフィールドを簡単に削除してしまう ようなことは残念ながらできません。 仮にOFSがフィールドの内容として絶対に出てこないならば、削除したい フィールドに空文字列を代入した後で、連続したOFSをひとつのOFSにする gsubを実行するくらいが代案でしょうか(OFSが正規表現のメタ文字である ときには要注意)。

参考URL:
http://www.kt.rim.or.jp/~kbk/gawk-30/gawk_6.html#SEC37
ritomo
質問者

お礼

ご回答ありがとうございました。返事が遅れてもうしわけありません。 フィールドの簡単な削除はできない件、わかりました。 1行をfor文などで繰り返しながら処理し、N項番目だけprintしないなどの方法を考えてみます。 ご提示のURLは参考になりました。ありがとうございます。

  • ham_kamo
  • ベストアンサー率55% (659/1197)
回答No.1

$1-$6というような書き方はできませんが、$1から$7まであって、$1から$6を表示したいなら、 $7="";print $0 と言う書き方があります。$7の値をこの後に使いたいのであれば、 tmp=$7;$7="";print $0;$7=tmp と一度変数に保存しておいて戻すという方法もあります。

ritomo
質問者

お礼

早速の回答ありがとうございます。 項番個所を""で上書きするイメージですね。便利なものを教わりました。ありがとうございます。

ritomo
質問者

補足

先ほどの回答ありがとうございます。 気になる点があります。このままですとOFSを付けないと"|"のセパレータが消えてしまう点、 最後のセパレータが残ってしまいます。 >> more aaaa 111|222|333|444|555|666|777 >> x.sh 111|222|333|444|555|666| >> more x.sh #!/bin/csh awk 'BEGIN {FS="|"} {OFS="|";$7="";print $0}' ./aaaa セパレータ+項目を1セットで無くす方法があればいいのですが。

関連するQ&A