電子書籍の厳選無料作品が豊富!

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

A 回答 (3件)

最後のフィールドだけ消せばいいのなら、組み込み変数NFをデクリメント


してやればいいです。$7=""だと中身が空のフィールドになるだけなので
余計なセパレータが出力されるように見えているのです。

ひょっとしたらNFをデクリメントしたあとで$0の再構築を
強制的にさせる必要があるかもしれません($0=$0 とか $1=$1で
やってくれるはず)。
    • good
    • 1
この回答へのお礼

ありがとうございました。
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だけを抜かして表示)
よろしかったら教えていただけないでしょうか?

お礼日時:2006/10/16 16:54

詳しくは参考URLの先を読んでいただくとして、



あるフィールドを空文字列にすることはできますが、それは内容が
空のフィールドを作るだけで削除ではありません。
ですので、ご希望のような途中のフィールドを簡単に削除してしまう
ようなことは残念ながらできません。

仮にOFSがフィールドの内容として絶対に出てこないならば、削除したい
フィールドに空文字列を代入した後で、連続したOFSをひとつのOFSにする
gsubを実行するくらいが代案でしょうか(OFSが正規表現のメタ文字である
ときには要注意)。

参考URL:http://www.kt.rim.or.jp/~kbk/gawk-30/gawk_6.html …
    • good
    • 0
この回答へのお礼

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

お礼日時:2006/10/18 10:59

$1-$6というような書き方はできませんが、$1から$7まであって、$1から$6を表示したいなら、


$7="";print $0
と言う書き方があります。$7の値をこの後に使いたいのであれば、
tmp=$7;$7="";print $0;$7=tmp
と一度変数に保存しておいて戻すという方法もあります。

この回答への補足

先ほどの回答ありがとうございます。
気になる点があります。このままですと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セットで無くす方法があればいいのですが。

補足日時:2006/10/16 13:34
    • good
    • 0
この回答へのお礼

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

お礼日時:2006/10/16 13:10

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