как найти максимальное и минимальное значения для конкретного столбца с использованием AWK [duplicate]

Это очень распространенная проблема, с которой мы сталкиваемся, борясь с «таинствами» JavaScript.

Давайте начнем с простой функции JavaScript:

function foo(){
// do something 
 return 'wohoo';
}

let bar = foo(); // bar is 'wohoo' here

Это простой синхронный вызов функции (где каждая строка кода выполняется одна за другой в последовательность), и результат будет таким же, как ожидалось.

Теперь добавим немного завихрения, введя небольшую задержку в нашей функции, чтобы все строки кода не выполнялись последовательно. Таким образом, он будет эмулировать асинхронное поведение функции:

function foo(){
 setTimeout( ()=>{
   return 'wohoo';
  }, 1000 )
}

let bar = foo() // bar is undefined here

Итак, вы идете, эта задержка просто сломала функциональность, которую мы ожидали! Но что именно произошло? Ну, на самом деле это довольно логично, если вы посмотрите на код. функция foo() после выполнения ничего не возвращает (таким образом, возвращаемое значение равно undefined), но оно запускает таймер, который выполняет функцию после 1s, чтобы вернуть «wohoo». Но, как вы можете видеть, значение, присвоенное бару, является немедленно возвращенным материалом из foo (), а не что-либо еще, что приходит позже.

Итак, как мы решаем эту проблему?

Давайте попросим нашу функцию для ОБЕЩАНИЯ. Обещание действительно о том, что это означает: это означает, что функция гарантирует, что вы предоставите любой результат, который он получит в будущем. поэтому давайте посмотрим на это в нашей маленькой проблеме выше:

function foo(){
   return new Promise( (resolve, reject) => { // I want foo() to PROMISE me something
    setTimeout ( function(){ 
      // promise is RESOLVED , when exececution reaches this line of code
       resolve('wohoo')// After 1 second, RESOLVE the promise with value 'wohoo'
    }, 1000 )
  })
}

let bar ; 
foo().then( res => {
 bar = res;
 console.log(bar) // will print 'wohoo'
});

Таким образом, резюме - для решения асинхронных функций, таких как вызовы на основе ajax и т. д., вы можете использовать обещание resolve значение (которое вы намерены вернуть). Таким образом, короче говоря, вы разрешаете значение вместо возврата в асинхронных функциях.

6
задан Wang Zong'an 21 April 2015 в 22:03
поделиться

3 ответа

Awk угадывает тип.

Строка «10» меньше строки «4», потому что символ «1» предшествует «4». Принудительный разговор типа, используя добавление нуля:

min=`awk 'BEGIN{a=1000}{if ($1<0+a) a=$1} END{print a}' mydata.dat`
max=`awk 'BEGIN{a=   0}{if ($1>0+a) a=$1} END{print a}' mydata.dat`
7
ответ дан Klaus Zeuge 27 August 2018 в 11:02
поделиться

Ваша проблема заключалась в том, что в вашем скрипте у вас было:

if ($1<a) a=$1 fi

и что final fi не является частью синтаксиса awk, поэтому он рассматривается как переменная, поэтому a=$1 fi является конкатенацией строк и поэтому вы являетесь TELLING awk, что a содержит строку, а не число и, следовательно, сравнение строк вместо числовых в $1<a.

Что более важно вообще, никогда не начинайте с какого-либо угадываемого значения для max / min, просто используйте первое значение, считанное как семя. Вот правильный способ написания скрипта:

$ cat tst.awk
BEGIN { min = max = "NaN" }
{
    min = (NR==1 || $1<min ? $1 : min)
    max = (NR==1 || $1>max ? $1 : max)
}
END { print min, max }

$ awk -f tst.awk file
4 12

$ awk -f tst.awk /dev/null
NaN NaN

$ a=( $( awk -f tst.awk file ) )
$ echo "${a[0]}"
4
$ echo "${a[1]}"
12

Если вам не нравится NaN выберите то, что вы предпочитаете печатать, когда входной файл пуст.

3
ответ дан Ed Morton 27 August 2018 в 11:02
поделиться

ответ не-awk:

cut -d" " -f1 file |
sort -n |
tee >(echo "min=$(head -1)") \
  > >(echo "max=$(tail -1)")

. Эта команда может быть слишком умной. tee дублирует поток stdin в имена файлов в качестве аргументов, а также передает те же данные в stdout. Я использую замену процессов для фильтрации потоков.

Тот же эффект может быть использован (с меньшим расцветком) для извлечения первой и последней строк потока данных:

cut -d" " -f1 file | sort -n | sed -n '1s/^/min=/p; $s/^/max=/p'

или

cut -d" " -f1 file | sort -n | { 
    read line
    echo "min=$line"
    while read line; do max=$line; done
    echo "max=$max"
}
3
ответ дан glenn jackman 27 August 2018 в 11:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: