我有一个如下所示的文本文件。
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
满足您要求的基于 的解决方案。