Причина, по которой это не работает так, как вы написали, заключается в том, что 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
Ответ αғsнιη показывает, как это можно сделать без использования цикла оболочки.
Краткий ответ:/etc/passwd
Длинный ответ :, чтобы найти имя фактического файла/папки, на которую указывает символическая ссылка, проверьте информацию после ->
в команде ls -l
. Ссылка passwd в вашем примере является относительной ссылкой . .../.. означает, что файл/каталог находится на (2 )уровнях выше того, с которого вы начинаете. Такая ссылка создается командой:
ln -s../../etc/passwd.
Теперь относительные ссылки прекрасно работают, если только они не перемещены на другой уровень каталога; попробуйте переместить passwd в .config и ссылка будет разорвана. Если бы ссылка была создана вот так:
ln -s /etc/passwd.
тогда ваша ссылка будет выглядеть так (сls
):
passwd -> /etc/passwd
и не важно, куда была перенесена ссылка.