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


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

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

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

回答の条件
  • 1人2回まで
  • 13歳以上
  • 登録:2011/06/29 13:29:26
  • 終了:2011/06/29 15:20:59

ベストアンサー

id:a-kuma3 No.1

a-kuma3回答回数4464ベストアンサー獲得回数18412011/06/29 13:40:38

ポイント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

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

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

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

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません