UNIXのawkの使い方についてです。


あるデータファイルがあり、その中のコメント行は">"で始まりスペースが続いています。
このファイルをawkで処理して新しいファイルを作りたいと思っています。

新しいファイルには、データファイルのコメント行はそのまま残し、データ行についてはある数値の列が条件を満たしていれば特定の列を取り出す、という操作をしたいと思っています。
例: $3<20 {print $1,$2>"newfile"}

どのように記述したらよいか教えていただけますか。

回答の条件
  • 1人2回まで
  • 登録:
  • 終了:2011/06/29 15:20:59
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:a-kuma3 No.1

回答回数4974ベストアンサー獲得回数2154

ポイント100pt

とりあえず、標準出力を宛先にすると、↓のような感じ。

/^> */ {
    print;
    next;
}

$3 < 20 {
    print $1, $2
}

コメントの解釈については、">" で始まり、その後に空白がゼロ個以上続いて、更に任意の文字がある行だ、と意訳しました。

">" で始まり、その後に必ずスペースがあり、他の文字は無い、ということであれば、

/^>  *$/ { ...

という感じでしょうか


で、実行するときには、上記のスクリプトファイルを、hoge.awk としたら、

% awk -f hoge.awk in.data > out.data

で、期待した回答になってます?

id:spin6536

回答ありがとうございます。一行で済ませるにはどうしたらいいでしょうか。こんな感じで。(だめだった例ですが)→

awk '$1 = ">" {print $0>"out.data"} $3 < 20 {print $1,$2>"out.data"}' in.data

2011/06/29 14:03:16
  • id:a-kuma3
    >awk '$1 = ">" {print $0>"out.data"} $3 < 20 {print $1,$2>"out.data"}' in.data

    自力で回答にたどりついているような気がしますが、こんな感じ。

    awk '$1 = ">" {print $0; next} $3 < 20 {print $1,$2}' in.data > out.data

    awk の中でファイルを指定するのが嫌いなので、標準出力に変えてますが、
    print $0 の後の next がポイントです。
    後、コメントの判定ですが、行の頭に空白が入ってもコメント扱いで良いなら $1 = ">" で良いと思いますが、
    行が ">" で始まるべきなら、こういう感じです。

    awk '/^>/ {print $0; next} $3 < 20 {print $1,$2}' in.data > out.data

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません