Возможно, я нашел свой собственный ответ:
https://stackoverflow.com/questions/36998143/alternative-way-to-obtain-argc-and-argv-of-a-process
__attribute__((constructor)) void stuff(int argc, char **argv)
{
for (int i=0; i
Конечно, остается проблема с пропуском аргументов, IE, вы можете просмотреть аргументы, но основная ()программа завершится ошибкой, когда обнаружит, что аргументы вашей библиотеки смешаны со своими собственными.
Весь ваш awk-скрипт можно упростить до этого:
awk 'max<$5 || NR==1{ max=$5; data=$2 } END{ print data }' infile
или "сохранить все строки второго столбца с одинаковыми максимальными значениями" в 5 ом столбце:
awk 'max<$5 || NR==1 { max=$5; data=$2; next }
max==$5{ data= data ORS $2 }
END{ print data }' infile
О вашем собственном скрипте, который вы написали таким образом, вам нужно дважды обработать входной файл, первый процесс находит максимальное значение, второй процесс печатает второй столбец строк, имеющих это максимальное значение, что-то вроде этого:
awk 'function max(val1, val2){
if (val1 > val2)
return val1
else
return val2
}
BEGIN { largest = 0 }
NR==FNR{ largest = max(largest,$5 + 0); next }
$5==largest { print $2 }' infile infile
Ваш вопрос интерпретируется как
Find the max value in column 5, then print all values in column 2 that have that max value.
awk '
NR == FNR {
if (FNR == 1 || $5 > max) max = $5
next
}
$5 == max {print $2}
' file file
Это обрабатывает файл дважды :один раз, чтобы найти максимальное значение, а затем еще раз, чтобы напечатать совпадающие значения. Я обмениваю уменьшенное использование памяти на увеличение времени работы.