我遇到多条线路困难。我希望解决这个问题能帮助我完成我需要完成的下一个任务。
逻辑
如果第一列匹配,请检查该行的最后一个字段是否大于或等于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
答案 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)();
}