Aplicando AWK em um conjunto de arquivos com a mesma extensão
-
05-07-2019 - |
Pergunta
Quero aplicar o seguinte comando "awk" em arquivos com extensão "*.txt"
awk '$4 ~ /NM/{ sum += $2 } END{ print sum }'
Mas por que este comando não funciona:
for i in *.txt do echo awk '$4 ~ /NM/{ sum += $2 } END{ print sum }' $i; done
Normalmente,
awk '$4 ~ /NM/{ sum += $2 } END{ print sum }' file1.txt
podia funcionar.
Solução
Depois de remover o eco, ele deve funcionar:
for i in *.txt do awk '$4 ~ /NM/{ sum += $2 } END{ print sum }' $i; done
Isso falhará se houver algum arquivo de texto com espaços neles, você pode tentar o seguinte:
find . -name '*.txt' -print0 | xargs --null -n 1 awk '$4 ~ /NM/{ sum += $2 } END{ print sum }'
Uma alternativa para imprimir nomes:
find . -name '*.txt' -print -exec awk '$4 ~ /NM/{ sum += $2 } END{ print sum }' {} \;
(Basicamente, faça o Find Execute Awk diretamente, e também imprima os nomes dos arquivos.
Outras dicas
for i in *.txt; do echo "$i"; awk '$4 ~ /NM/{ sum += $2 } END{ print sum }' "$i"; done
Isso imprimirá os nomes dos arquivos processados junto com a saída do awk
comando.
Tente isso (use Nawk ou /usr/xpg4/bin/awk sobre Solaris):
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
Você precisa adicionar um ';' :
for i in *.txt; do ...
ao invés de
for i in *.txt do ...
Echo não é necessário.
tentar
para i em *.txt; Faz; awk '$ 4 ~ /nm /{sum += $ 2} end {print sum}' $ i; feito
ou
para i em *.txt; faça awk '$ 4 ~ /nm /{sum += $ 2} end {print sum}' $ i; feito
Deveria trabalhar
Não tenho certeza se você copia colado ou é um erro de digitação.
para eu em *.txt fazer eco awk '$ 4 ~ /nm /{sum += $ 2} end {print sum}' $ i; feito
Com o Echo corrigido, o comando acima ecoará seu script AWK e o nome do arquivo, mas não o executará.