查找第 1 列范围内的最大值并打印第 2 列

查找第 1 列范围内的最大值并打印第 2 列

我有一个代表性的数据集

 35.5259  327   
 35.526  326   
 35.526  325  
 35.5261  324   
 35.5262  323   
 35.5263  322   
 35.5264  321   
 35.5265  320   
 35.5266  319  
 35.5268  318


# Contour 4, label:
 35.5269  317   
 35.527  316  
 35.5272  315  
 35.5274  314   
 35.5276  313   
 35.5278  312   
 35.528  311  

# Contour 4, label:
 35.5282  310  
 35.5285  309  
 35.5287  308  
 35.529  307  
 35.5293  306  

我尝试使用以下方法找到第 2 列范围内的两个最大值:

awk '320>$2,$2>315 && $1>max1{max1=$1;line=$2} 313>$2,$2>307 && $1>max2{max2=$1;line2=$2} END {printf " %s\t %s\t %s\t %s\n",max1,line,max2,line2}' FILENAME

我只是得到空白输出(因为我的 txt 文件中有很多空格)如何忽略它? $1+0 == $1 ?

我想找到 col1 中 320 到 315 之间以及 col2 中 313-307 之间的最大值。我需要的输出:

35.5266  319   35.5278  312

如何获得所需的输出?谢谢

答案1

如果您更改,&&.

但我认为你也有逻辑错误。不应该$1>max1$2>line1(并且与 相同max2/line2) 吗?

awk '
  320>$2 && $2>315 && $2>line1 {max1=$1;line1=$2}
  313>$2 && $2>307 && $2>line2 {max2=$1;line2=$2}
  END {printf " %s\t %s\t %s\t %s\n",max1,line1,max2,line2}
' file

答案2

我看到 pLumo 的答案确实给出了您的样本输出,但您的问题是关于找到最大值在第 1 列范围内;示例输出打印最大值在第 2 栏。所以我认为你要么错误地陈述了你的问题,要么错误地陈述了你的示例输出。另外,当您说“介于”320 和 315 之间时,这些数字本身也包括在内吗?我假设它们在这个提议的解决方案中(所以>=操作员);我习惯于next忽略任何不只有 2 个字段的行;我BEGIN通过良好的实践来初始化我选择的变量。

awk 'BEGIN {max1=max2=line1=line2=0}
     NF!=2 {next}
     320>=$2 && $2>=315 && $1>max1 {max1=$1;line1=$2}
     313>=$2 && $2>=307 && $1>max2 {max2=$1;line2=$2}
     END {printf " %s\t %s\t %s\t %s\n",max1,line1,max2,line2}' file.name.here

相关内容