Awk 找到最小值并打印相应的列值

Awk 找到最小值并打印相应的列值,awk,Awk,我有一个数据集,如下所示: 35.7412 342 35.7598 341 35.7796 340 35.8008 339 35.8233 338 35.8471 337 35.8721 336 35.8984 335 35.9259 334 35.9546 333 35.9843 332 现在,我需要找到几个文件的最小值,并执行以下操作: awk 'FNR==1 { if (min) print m

我有一个数据集,如下所示:

35.7412  342  
35.7598  341  
35.7796  340  
35.8008  339   
35.8233  338   
35.8471  337   
35.8721  336   
35.8984  335  
35.9259  334   
35.9546  333   
35.9843  332 
现在,我需要找到几个文件的最小值,并执行以下操作:

awk 'FNR==1 {
   if (min)
      print min
   min = ""
   fn = FILENAME
}
$1+0 == $1 && (min=="" || $1 < min) {
   min=$1
}
END {
   print min
}' *.txt
但是,我也想打印相应的值,即

35.7412 342 
有没有关于如何打印$2列值的建议?
谢谢

请尝试以下用GNU awk编写和测试的内容

说明:为上述代码添加详细说明

awk '                                     ##Starting awk program from here.
FNR==1{                                   ##Checking condition if line is first line then do following.
  delete val                              ##Delete array named val here.
  min=""                                  ##Nullifying min variable value here.
}
{
  min = (min<$1 ? (min ? min : $1) : $1)  ##Creating variable min whose value we are checking is lesser than current $1 or not.
  val[$1]=$0
}
ENDFILE{                                  ##Using ENDFILE section for each Input_file here.
  print val[min]                          ##Printing array val value with variable min as index here.
}
' *.txt                                   ##Mentioning all .txt files here.
使用bash

for file in *txt;do sort -t" " -nr -k1 ${file} |  head -1; done;
OP的尝试

awk 'FNR==1 {
   if (min)
      print rec
   min = ""
   fn = FILENAME
}
$1+0 == $1 && (min=="" || $1 < min) {
   min=$1; rec=$0;
}
END {
   print rec
}' *.txt


在进行最小/最大值计算时,不要将最小/最大值初始化为某个任意值,只需始终将最小/最大值初始化为读取的第一个值,然后无论文件包含的值是什么,它都会工作,即使它们都是负值。

$0变量保存整个记录。尝试打印$0print min,$0在脚本中不起作用将其保存在变量中,就像保存的最小值一样检查我的编辑->如果min为0,现有脚本将失败。您需要测试分钟!=,不仅仅是min,在打印之前。为什么要测试$1+0==$1?您的实际输入是否包含一些$1不是数字的行?你为什么要用fn保存文件名?你从来不使用它。
for file in *txt;do sort -t" " -nr -k1 ${file} |  head -1; done;
awk 'FNR==1 {
   if (min)
      print rec
   min = ""
   fn = FILENAME
}
$1+0 == $1 && (min=="" || $1 < min) {
   min=$1; rec=$0;
}
END {
   print rec
}' *.txt

awk '
    FNR == 1 {
        if (NR > 1) {
            print rec
        }
        min = $1
    }
    $1 <= min {
        min = $1
        rec = $0
    }
    END {
        print rec
    }
' *.txt