Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
AWK-匹配第一列,如果最后一个字段的任何值大于1000,则打印两行_Awk - Fatal编程技术网

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

AWK-匹配第一列,如果最后一个字段的任何值大于1000,则打印两行,awk,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

我很难将多行作为一行。我希望解决这个问题能帮助我完成下一步需要完成的任务

逻辑

如果第一列匹配,请检查行的最后一个字段是否大于或等于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

一种双扫描算法

$ 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

假设值为正(因此,总和不等于零,这将过滤掉它们)。

双扫描算法

$ 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

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

我不明白为什么您的“期望”输出和最后一个输出看起来相同,除了交换的组我不明白为什么您的“期望”输出看起来相同输出和最后一个输出看起来相同,除了交换的组。这一个将值相加,而不是对两行进行排序,然后根据顶行重新排序。谢谢如果这不是您想要的,那么您需要详细说明“使用匹配行的总和使用所有行”。这一个总结了值,而不是排序两行,然后根据最上面的行进行重新排序。谢谢如果这不是你想要的,那么你需要详细说明“使用匹配行的总和使用所有行”