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.

Foi útil?

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á.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top