基于带有标题的条件的 awk 列

基于带有标题的条件的 awk 列

我有一个如下所示的文本文件。

variable1  
10 20 30  
40 50 60

variable2  
2 4 40  
3 2 1

variable3   
2 4 2  
3 2 1

如果 col3>20 输出应类似于下面的 header(variable1/2) 值

variable1  
10 20 30  
40 50 60  

variable2  
2 4 40  

如果没有匹配,则不应打印任何内容,也不应打印标题。

答案1

根据我对要求的解释

 awk 'NF==1 { head=$0; printed=0; }
      NF==3 && $3>20 { 
          if(!printed) {
              printed=1;
              if(firstdone)print ""; else firstdone=1;
              print head
          }
          print
      }' inputfile

或更短的变体

awk 'NF==1 { head=$0; printed=0; }
     NF==3 && $3>20 {
         if(!printed++) {
             if(firstdone++)print "";
             print head
         };
         print
     }' inputfile
awk 'NF==1 { head=$0; }
     NF==3 && $3>20 {
         if(head) {
             if(firstdone++)print "";
             print head;
             head=""
         };
         print
     }' inputfile

有输入

variable1
10 20 30
40 50 60

variable2
2 4 40
3 2 1

variable3
10 10 10
5 5 5

variable4
1 1 1
2 2 21
3 3 3

输出是

variable1
10 20 30
40 50 60

variable2
2 4 40

variable4
2 2 21

答案2

基于对您的要求的一种解释:

awk '(NF<3) || ($3 > 20)' file

答案3

根据您修改后的输入:

awk 'NF<=1 || (NF==3 && $3>20)' input

如果该行为空、仅包含一个单词(=标题行)或包含三个字段(其中第三个字段大于 20),则将打印一行。

编辑您对问题的最后修改使这个答案变得过时。参考@博多的回答寻找awk满足您要求的基于 的解决方案。

相关内容