Применение AWK к набору файлов с одинаковым расширением

StackOverflow https://stackoverflow.com/questions/625563

Вопрос

Я хочу применить следующую команду "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-скрипт и имя файла, но не запустит его.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top