组合多个awk命令

组合多个awk命令,awk,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=\n\n' '/^Col1 /' | awk '$2 == "bar"

假设以下输入:

$ 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=\n\n' '/^Col1 /' | awk '$2 == "bar" && $3 > 1 {print $1}'
foo
baz
baz
如何将这两个片段组合成一个单独的awk,例如

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

使用一个标志,在找到“Col1”时将其设置为第一列,并在设置后发现空行时将其重置。在此期间,检查最后一根管道的状况:

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

foo
baz
baz
这似乎奏效了

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.
}
你可以做:

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

请注意,
'RS=\n\n'
仅适用于gawk。谢谢,这很酷,效果也很好!但是,这是唯一的方法吗?还是也可以在awk脚本的开头解析出一些数据,然后用另一个awk位处理这些数据?有点像从一个awk到另一个awk的管道输出,如所提供的示例中所示,但在单个awk脚本中?@user145664:抱歉。我不理解你对想要实现什么的解释。对不起,我的意思是,有没有可能重新创建示例的流程,其中使用awk的第一位实现的数据集然后通过管道传输到awk的第二位,在第二位,数据集进一步减少,但不同于从一个awk命令到另一个awk命令的管道传输,整个过程在一个awk脚本中完成。基本上,保持示例的流程,但没有第二次调用awk?William Pursell的示例具有我很难解释的流程。尽管没有前导的空白行,但这与之匹配。很高兴知道,谢谢(尽管对于手头的用例来说不是问题)。没问题。请注意,按原样,这将在文件中的空行后匹配数据集的多次出现。如果您确信只会找到一个数据集,或者只想获取第一个数据集,则可以添加
nextfile
doit=0的行之后
,或者如果只有一个输入文件,只需退出