Найдите минимум и выведите соответствующее значение столбца. - PullRequest
0 голосов
/ 26 апреля 2020

У меня есть набор данных, указанный ниже:

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

Но я хотел бы также напечатать соответствующее значение, то есть

35.7412 342 

Любые предложения о том, как напечатать значение столбца $ 2? Спасибо

Ответы [ 3 ]

4 голосов
/ 26 апреля 2020
awk '
    FNR == 1 {
        if (NR > 1) {
            print rec
        }
        min = $1
    }
    $1 <= min {
        min = $1
        rec = $0
    }
    END {
        print rec
    }
' *.txt

При выполнении расчетов min / max вместо инициализации min / max каким-либо произвольным значением просто всегда инициализируйте min / max первым прочитанным значением, и тогда оно будет работать независимо от того, какие значения содержит ваш файл, даже если они все отрицательные значения.

3 голосов
/ 26 апреля 2020

Не могли бы вы попробовать следующее (написано и протестировано в GNU awk).

awk '
FNR==1{
  delete val
  min=""
}
{
  min = (min<$1 ? (min ? min : $1) : $1)
  val[$1]=$0
}
ENDFILE{
  print val[min]
}
' *.txt

Объяснение: Добавление подробного объяснения для приведенного выше кода.

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.
1 голос
/ 26 апреля 2020

Использование bash

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...