6

次の入力を想定しています。

$ cat example
{many lines of text}

Col1 Col2  Col3
foo  bar   2 
bar  baz   3
baz  bar   8
bar  foo   0
foo  baz   9
baz  bar   3

{many more lines of text}

次の2つのawkスニペットは、私が求めているデータを解析します。

cat example | awk -v 'RS=\n\n' '/^Col1 /' | awk '$2 == "bar" && $3 > 1 {print $1}'
foo
baz
baz

2つのスニペットを1つのawkに結合するにはどうすればよいですか?

awk '
...
...
...
' example
4

3 に答える 3

6

できるよ:

awk '/^Col1 /,/^$/{ if( $2 == "bar" && $3 > 1 ) print $1}' example
于 2012-08-28T21:18:11.630 に答える
5

これはうまくいくようです。

gawk '/^$/{getline;if(/^Col1/){doit=1}else{doit=0;}} doit && $2=="bar" && $3>1 {print $1}' example

コメント付きの読み取り可能なチャンクに分割されます。これは次のとおりです。

/^$/ {                      # Look for a blank line
  getline;                  # Get the next line
  if (/^Col1/) {            # See if your column heads exist.
    doit=1                  # If they do, set a boolean to true
  } else {
    doit=0;                 # Otherwise, false.
  }
}

doit && $2=="bar" && $3>1 { # Check the boolean AND your conditions, then
  print $1                  # print.
}
于 2012-08-28T21:11:35.297 に答える
2

フラグを使用し、最初の列として「Col1」が見つかったときに設定し、設定後に空白行が見つかったときにリセットします。その間に、最後のパイプの状態を確認します。

awk '
    $1 == "Col1" { 
        block = 1; 
    } 
    block == 1 && $2 == "bar" && $3 > 1 { 
        print $1; 
    } 
    block == 1 && $0 ~ /^[[:blank:]]*$/ { 
        exit 0; 
    }
' infile

出力:

foo
baz
baz
于 2012-08-28T20:51:40.983 に答える