Применение AWK к набору файлов с одинаковым расширением
-
05-07-2019 - |
Вопрос
Я хочу применить следующую команду "awk" к файлам с расширением "*.txt"
awk '$4 ~ /NM/{ sum += $2 } END{ print sum }'
Но почему эта команда не работает:
for i in *.txt do echo awk '$4 ~ /NM/{ sum += $2 } END{ print sum }' $i; done
Обычно,
awk '$4 ~ /NM/{ sum += $2 } END{ print sum }' file1.txt
это сработало бы.
Решение
Как только вы удалили echo, оно должно сработать:
for i in *.txt do awk '$4 ~ /NM/{ sum += $2 } END{ print sum }' $i; done
Это не сработает, если в них есть какие-либо текстовые файлы с пробелами, вы могли бы попробовать это:
find . -name '*.txt' -print0 | xargs --null -n 1 awk '$4 ~ /NM/{ sum += $2 } END{ print sum }'
Альтернатива для распечатки имен:
find . -name '*.txt' -print -exec awk '$4 ~ /NM/{ sum += $2 } END{ print sum }' {} \;
(В основном заставляйте find выполнять awk напрямую, so, а также распечатывайте имена файлов.
Другие советы
for i in *.txt; do echo "$i"; awk '$4 ~ /NM/{ sum += $2 } END{ print sum }' "$i"; done
При этом будут напечатаны имена обработанных файлов вместе с выводом awk
команда.
Попробуйте это (используйте наукообразный или /usr/xpg4/bin/awk на Солярис):
awk 'END {
printf "%s: %.2f\n", fn, sum
}
FNR == 1 {
if (fn) printf "%s: %.2f\n", fn, sum
fn = FILENAME
sum = 0
}
$4 ~ /NM/ {
sum += $2
}' *.txt
Вам нужно добавить ';' :
for i in *.txt; do ...
вместо того , чтобы
for i in *.txt do ...
echo не требуется.
попробуй
для i в *.txt;делай;awk '$ 4 ~ /NM/{ сумма += $ 2 } КОНЕЦ{ вывести сумму }' $i;Выполнено
или
для i в *.txt;сделать awk '$ 4 ~ /NM/{ sum += $ 2 } END{ вывести сумму}' $i;Выполнено
должно сработать
Не уверен, что вы скопировали вставленную информацию или это опечатка.
ибо я в *.txt делаю эхо awk '$ 4 ~ /NM/{ сумма += $ 2 } КОНЕЦ{ вывести сумму }' $i;Выполнено
Исправив echo, приведенная выше команда отобразит ваш awk-скрипт и имя файла, но не запустит его.