#!/bin/bash
cat - <<-EOD > testMinMaxData.txt
1346995- 25
1- 2 elastic 5.9309E-01 -1.0920E-02 0.0000E+00 2.4431E-04 2.3158E-03 1.0608E-03 7.4616E-02
2- 2 elastic 6.1335E-01 -9.1746E-03 0.0000E+00 -4.2870E-04 2.3158E-03 1.0608E-03 7.4089E-02
3- 2 elastic 6.4586E-01 -7.3146E-03 0.0000E+00 -1.2961E-03 2.3158E-03 1.0608E-03 7.3794E-02
4- 2 elastic 6.7056E-01 -1.5564E-03 0.0000E+00 -1.0469E-03 2.3158E-03 1.0608E-03 7.3682E-02
5- 2 elastic 6.7493E-01 7.1420E-03 0.0000E+00 1.7934E-03 2.3158E-03 1.0608E-03 7.3708E-02
6- 2 elastic 6.7828E-01 1.4787E-02 0.0000E+00 5.4871E-03 2.3158E-03 1.0608E-03 7.3825E-02
7- 2 elastic 6.8092E-01 1.9656E-02 0.0000E+00 8.2580E-03 2.3158E-03 1.0608E-03 7.4210E-02
1346996- 25
1- 2 elastic 6.0586E-01 -4.6476E-03 0.0000E+00 9.4464E-03 -1.9585E-03 -5.1396E-03 7.4299E-02
2- 2 elastic 6.2548E-01 -5.1646E-03 0.0000E+00 6.3450E-03 -1.9585E-03 -5.1396E-03 7.4147E-02
3- 2 elastic 6.5631E-01 -5.3780E-03 0.0000E+00 1.1554E-03 -1.9585E-03 -5.1396E-03 7.4000E-02
4- 2 elastic 6.7186E-01 -1.5611E-03 0.0000E+00 -3.7045E-03 -1.9585E-03 -5.1396E-03 7.3999E-02
5- 2 elastic 6.7481E-01 5.1501E-03 0.0000E+00 -7.2939E-03 -1.9585E-03 -5.1396E-03 7.4107E-02
6- 2 elastic 6.7769E-01 1.1733E-02 0.0000E+00 -1.0146E-02 -1.9585E-03 -5.1396E-03 7.4238E-02
EOD
if ${testingMode:-true} ; then
set -- testMinMaxData.txt
fi
awk '
NF==2{gsub(/[ ]*/,"",$0); header=$0}
NF==10{print header "\t" $10}
' "${@:?Usage:$0 file1 [file2 ....]}" \
| awk '{
hd=$1
if (! (hd in hdrs)) {
hdrs[hd]=++i ; hdrsVal[i]=hd; min[hd]=999999; max[hd]=0.000000009 ;
#dbg print "#dbg:added " hd " to hdrs"
}
#dbg print "#dbg:$2=" $2 "\tmin["hd"]=" min[hd] "\tmax["hd"]="max[hd]
if ($2 < min[hd]) {
min[hd]=$2
#dbg print "#dbg:added "$2" to min["hd"]"
}
if ($2 > max[hd]+0.0) {
max[hd]=$2
#dbg print "#dbg:added "$2" to max["hd"]"
}
}
END {
#dbg for (x in hdrs) print "hdrs["x"]=" hdrs[x]
for (j=1;j<=i;j++) {
print hdrsVal[j] "\t" min[hdrsVal[j]] "\t" max[hdrsVal[j]]
}
}
'\
| awk 'BEGIN{
minVal=9999999999
maxVal=.000000009
}
{
if ($2 < minVal) {
minVal=$2 ; minTag=$1
#dbg print "#dbg:added "$2" to min["hd"]"
}
if ($3 > maxVal) {
maxVal=$3 ; maxTag=$1
#dbg print "#dbg:added "$2" to max["hd"]"
}
}
END {
print "min=" minVal " at " minTag
print "max=" maxVal " at " maxTag
}
'
output
min=7.3682E-02 at 1346995-25
max=7.4616E-02 at 1346995-25
Этот сценарий представляет собой автономный набор тестов для проверки концепции.Для реального использования я бы порекомендовал удалить оба из следующих «блоков» кода и оставить только 3 awks в вашем рабочем файле сценария.
Блок cat ... > testMin...EOD
создает ваши данные примера в тестовом файле.
Блок if ${testingMode:-true}...
использует функцию оболочки set -- arg1 arg2 ...
для установки позиционных параметров.Затем это значение раскрывается как параметр оболочки "$ {@}", который вы видите в конце первой программы awk (непосредственно перед символом канала ('|')).
Я также включил оценку использования в оценку "${@?Usage:$0 file1 [file2 ...]}"
.Если имена файлов не указаны, скрипт выдаст вам простое сообщение об ошибке / использовании.
Я оставил операторы отладки, вы можете удалить символ '#' впереди, чтобы увидеть, как обрабатываются данные при его обработке.проходит через скрипт.
Обратите внимание, что ассоциативные массивы awk hdrs[hd]=++i ; hdrsVal[i]=hd;
и т. д. не всегда интуитивно очевидны для нового пользователя awk.НО awk ассоциативные массивы - одна из самых мощных функций языка.Они определенно стоят вашего времени на эксперименты, чтобы понять, как они работают.Включите некоторые строки отладки, чтобы увидеть, где какие значения сортируются.
Единственная причина, по которой я сохраняю arr hdrs[hd]
, заключается в том, что в конце мы можем перечислять через массив с помощью числового ключа (1,2,3, ...) это означает, что данные будут напечатаны в том порядке, в котором они были прочитаны, и, используя значение, возвращаемое hdrs[2]=1346995-25
, мы можем искать минимальное и максимальное значения через min [1346995-25],max [1346995-25].
Наконец, поскольку ваши данные выглядят как технические данные, вы можете найти дополнительную помощь, посмотрев ссылки на awk.info - Engineering
Правка
Я добавил окончательную дистилляцию всего к 1 минуте и к максимальному значению с помощью setID.
Вы написали
КакМогу ли я добавить имя входного файла и имя выходного файла.
Когда вы редактируете скрипт, как я уже упоминал выше, вам необходимо сохранить файл.
Затем из командной строки Unix / Linux / Cygwin вам нужно «пометить»файл, чтобы ОС знала, что он должен быть исполняемым.
chmod 755 ./myMinMaxFinder.sh
Теперь вы можете выполнить cmd следующим образом:
./myMinMaxFinder.sh file1 [file2 .... filen] > myOUTPUT.FILE
Это стандартный способ создания выходных файлов в Unix.,Обработка аргументов будет платой за консультацию; -)
Я упоминал awk.info выше.Поскольку вы инженер-механик, обязательно ознакомьтесь с
http://awk.info/?doc/mecheng.html
Это также указывает на другой веб-сайт, выполненный инженером-механиком
http://www.tikmark.com/awkeng/awkscripts.html
Дизайн, который я здесь используюэто традиционный Unix-конвейер.Каждый раздел awk решает одну часть головоломки.Вы можете отключить любой раздел (вставив 2 пустые строки и добавив exit
, чтобы увидеть, что делает каждый этап скрипта.
Для получения более общей информации об использовании awk, см. Этот самый превосходный GrymoireAwk Tutorial
Надеюсь, это поможет.