首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >组合多个awk命令

组合多个awk命令
EN

Stack Overflow用户
提问于 2012-08-29 04:44:26
回答 3查看 12.5K关注 0票数 6

假设输入如下:

代码语言:javascript
复制
$ 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代码片段解析出了我想要的数据:

代码语言:javascript
复制
cat example | awk -v 'RS=\n\n' '/^Col1 /' | awk '$2 == "bar" && $3 > 1 {print $1}'
foo
baz
baz

如何将这两个代码片段组合成一个单独的awk代码,例如

代码语言:javascript
复制
awk '
...
...
...
' example
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-08-29 05:18:12

您可以执行以下操作:

代码语言:javascript
复制
awk '/^Col1 /,/^$/{ if( $2 == "bar" && $3 > 1 ) print $1}' example
票数 6
EN

Stack Overflow用户

发布于 2012-08-29 05:11:35

这似乎是可行的。

代码语言:javascript
复制
gawk '/^$/{getline;if(/^Col1/){doit=1}else{doit=0;}} doit && $2=="bar" && $3>1 {print $1}' example

分成带注释的可读块,这是:

代码语言:javascript
复制
/^$/ {                      # 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.
}
票数 5
EN

Stack Overflow用户

发布于 2012-08-29 04:51:41

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

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

输出:

代码语言:javascript
复制
foo
baz
baz
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12167250

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档