объединение нескольких команд awk

предполагая следующим образом:

$ 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}

следующие два фрагмента awk анализируют данные, которые я ищу:

cat example | awk -v 'RS=nn' '/^Col1 /' | awk ' == "bar" &&  > 1 {print }'
foo
baz
baz

как объединить два фрагмента в один бит awk, например

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

3 ответов


вы можете сделать:

awk '/^Col1 /,/^$/{ if(  == "bar" &&  > 1 ) print }' example

Это, кажется, работает.

gawk '/^$/{getline;if(/^Col1/){doit=1}else{doit=0;}} doit && =="bar" && >1 {print }' 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 && =="bar" && >1 { # Check the boolean AND your conditions, then
  print                   # print.
}

используйте флаг, установите его, когда нашли "Col1" в качестве первого столбца и сбросьте его, когда нашли пустую строку после ее установки. Между этим проверьте состояние вашей последней трубы:

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

выход:

foo
baz
baz