AWK - 匹配第一列,如果最后一个字段的任何值大于1000,则打印两行

时间:2018-04-11 17:58:09

标签: awk

我遇到多条线路困难。我希望解决这个问题能帮助我完成我需要完成的下一个任务。

逻辑

如果第一列匹配,请检查该行的最后一个字段是否大于或等于1000.如果是,则打印所有行。

当前代码:

我已尝试过基本代码,但我知道它失败了,因为我没有对匹配的行进行分组。

awk -F' ' '$1==$1 {print $0}' file | awk -v X=1000 -F' ' '{if($NF >= X)print $0}'

文件

LSP0    NODE0   NODE4   NODE3   591
LSP0    NODE0   NODE4   NODE5   NODE3   515
LSP1    NODE2   NODE4   NODE3   NODE6   5511
LSP1    NODE2   NODE1   551
LSP2    NODE4   NODE5   NODE7   60714
LSP2    NODE1   1501

所需输出

LSP1    NODE2   NODE4   NODE3   NODE6   5511
LSP1    NODE2   NODE1   551
LSP2    NODE4   NODE5   NODE7   60714
LSP2    NODE1   1501

可能的吗

如果第一列匹配,请将最后一个字段相加。使用匹配线的总和来计算所有线。

LSP2    NODE4   NODE5   NODE7   60714
LSP2    NODE1   1501
LSP1    NODE2   NODE4   NODE3   NODE6   5511
LSP1    NODE2   NODE1   551

2 个答案:

答案 0 :(得分:1)

双扫描算法

$ awk 'NR==FNR{a[$1]+=($NF>=1000); next} a[$1]' file{,}

LSP1    NODE2   NODE4   NODE3   NODE6   5511
LSP1    NODE2   NODE1   551
LSP2    NODE4   NODE5   NODE7   60714
LSP2    NODE1   1501

在第一次扫描中标记条件匹配的键,然后在第二次扫描中打印过滤的行。

以下是已排序的变体

$ awk 'NR==FNR {a[$1]+=($NF>=1000)?$NF:0; next} 
       a[$1]   {print a[$1] "\t" $0}' file{,} | sort -s -k1nr | cut -f2-

LSP2    NODE4   NODE5   NODE7   60714
LSP2    NODE1   1501
LSP1    NODE2   NODE4   NODE3   NODE6   5511
LSP1    NODE2   NODE1   551

假设值为正值(因此不要将它们总计为零,这会将它们过滤掉)。

答案 1 :(得分:1)

function run() {
    new Function([], document.getElementById('input').value)(); 
}