For цикл с командой awk в теле не работает

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

Однако не происходит переключения контекста процесса, поэтому код ядра по-прежнему выполняется в контексте вызывающего процесса. Это означает, что ядру не нужно искать, какой процесс его вызывает, оно уже знает это. Код системного вызова getpid просто извлекает идентификатор процесса из указателя на внутреннюю структуру, содержащую специфическую для процесса/потока информацию. Эта структура зависит от реализации операционной системы.

Например, в Illumos (OpenSolaris) структура называется proc: http://src.illumos.org/source/xref/illumos-gate/usr/src/uts/common/sys/proc.h#131

0
26.03.2018, 05:57
2 ответа

Здесь вы можете использовать только awk.

awk 'NR==FNR{a[$1]++; next} ($1 in a) {sum+=$4} END{print sum}' file1.txt file2.txt
2
28.01.2020, 02:18

Причина, по которой это не работает так, как вы написали, заключается в том, что awkбудет интерпретировать $iкак "i-е поле", а поскольку awkпеременная iне имеет значения, вы будет получено сообщение об ошибке, или если вы используете GNU awkили mawk, $iбудет таким же, как $0, то есть вся строка (с mawkили GNU awk, программа ищет строки, первый столбец которых совпадает со всей строкой ).

Вместо этого, чтобы «импортировать» вашу переменную оболочки вawk:

awk -v i="$i" '$1 == i { sum += $4 } END { print sum }' test2.txt

Кроме того, значение переменной оболочки $iвсегда будет только именем файла test1.txt(, так как это то, что вы перебираете в цикле ).

Циклический просмотр содержимого файла:

while IFS= read -r i; do
    awk...as above...
done <test1.txt

Ответ αғsнιη показывает, как это можно сделать без использования цикла оболочки.

2
28.01.2020, 02:18

Теги

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