У меня недостаточно репутации, чтобы комментировать, поэтому я вынужден ответить ответом. Мой первый комментарий был бы о том, что awk — не лучший инструмент для математики с действительными числами. Это лучше для строк и целых чисел.
Другие моменты в awk :Параграф BEGIN происходит до того, как какие-либо строки будут прочитаны из вашего ввода. Параграф END происходит после прочтения всех строк.
Примечание. :awk не сохраняет и не заботится ни о чем, кроме текущей строки/записи ввода,если вы не предпримете шаги для хранения записей/полей в своем коде. Это должно произойти между BEGIN и END.
Ваш код между этими абзацами только устанавливает/сбрасывает переменные, но ничего не делает с их значениями. По сути, вы могли бы «закрепить» -1 входной файл и направить вывод в cut, чтобы добиться аналогичных результатов.
Похоже, вы намеревались проверить число в столбце 4, чтобы найти max или max1, и вывести столбец 1 только в том случае, если столбец 4 содержит этот максимум, после чего следует успешная проверка столбцов 2 и 3. Эту логику необходимо переместить перед END, если только вы не заботитесь только о последней строке файла.
Помните, что в awk каждая строка ввода (по умолчанию )сравнивается с каждым условием. Если условие истинно, выполняется действие или список действий. Вполне возможно, что несколько условий запускают действия в одной и той же строке.
Мое первое впечатление, что вам нужно -переоценить свой процесс. Определите порядок важности и примите соответствующие меры. Например, для меня первый порядок важности воздействует только на данные между двумя флагами в моем входном файле. Затем определите, могут ли действительные числа в каждом из 4 полей быть преобразованы в (или обработаны как )целые числа (или строки )без потери их значения. Сами фактические данные не нужно менять, только их представление в вашем коде. Их можно преобразовать обратно, но вероятность потери точности исходного числа высока. Наконец, выберите, нужно ли вам сохранять все/любые из этих несортированных, случайных данных для последующей обработки или выдавать немедленный вывод построчно.
Следующий мета-пример можно было бы сделать намного эффективнее... Начните с флага, чтобы вы знали, пора ли начать синтаксический анализ. Вы уже видели строку $0 ~= /Nodes/? старт=0.Вы также можете подготовиться к тому, чтобы знать, когда прекратить синтаксический анализ данных, проверив строку $0 ~= /EndNodes/, stop=0. И вам может понадобиться счетчик, если вы храните данные, count=0.
BEGIN {
start=0
stop=0
count=0
max=0
}
/EndNodes/ {
stop=1
}
/Nodes/ {
start=1
}
NF==4 {
if (start==1 && stop==0) {
count++
column1[count]=$1
column2[count]=substr($2,1,index($2,".")-1)
column3[count]=substr($3,1,index($3,".")-1)
column4[count]=substr($4,1,index($4,".")-1)
}
}
# Now print column1 if column2 is non-negative and column3=0 and column4=max
# In the first loop through the array/list, find max
END {
for (loop=1;loop<=count;loop++) {
if (column4[loop]>max) {
max=column4[loop]
}
}
for (loop=1;loop<=count;loop++) {
if (column4[loop]==max && column3[loop]==0 && column2[loop]>=0) {
print column1[loop]
}
}
}
Как написано, вывод будет
20
31
32
В настоящее время драйвер Linux для этого устройства отсутствует.
Вы можете следить за этим по этим двум ссылкам: