Question

Je souhaite appliquer le " awk " suivant commande sur les fichiers portant l'extension "*. txt"

awk '$4 ~ /NM/{ sum += $2 } END{ print sum }'

Mais pourquoi cette commande ne fonctionne pas:

for i in *.txt do echo awk '$4 ~ /NM/{ sum += $2 } END{ print sum }' $i; done

Normalement,

awk '$4 ~ /NM/{ sum += $2 } END{ print sum }' file1.txt

fonctionnerait.

Était-ce utile?

La solution

Une fois que vous avez supprimé l'écho, cela devrait fonctionner:

for i in *.txt do awk '$4 ~ /NM/{ sum += $2 } END{ print sum }' $i; done

Cela échouera s'il y a des fichiers texte contenant des espaces, vous pouvez essayer ceci:

find . -name '*.txt' -print0 | xargs --null -n 1 awk '$4 ~ /NM/{ sum += $2 } END{ print sum }'

Une alternative pour imprimer les noms:

find . -name '*.txt' -print -exec awk '$4 ~ /NM/{ sum += $2 } END{ print sum }' {} \;

(Fondamentalement make find execute awk directement, donc et affiche également les noms de fichiers.

Autres conseils

for i in *.txt; do echo "$i"; awk '$4 ~ /NM/{ sum += $2 } END{ print sum }' "$i"; done

Ceci imprimera les noms des fichiers traités ainsi que le résultat de la commande awk .

Essayez ceci (utilisez nawk ou / usr / xpg4 / bin / awk sous 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 

Vous devez ajouter un ';' :

for i in *.txt; do ...

au lieu de

for i in *.txt do ...

echo n'est pas requis.

essayer

pour i dans * .txt; faire; awk '$ 4 ~ / NM / {sum + = 2}} END {print sum}' $ i; fait

ou

pour i dans * .txt; do awk '$ 4 ~ / NM / {sum + = 2}} END {print sum}' $ i; fait

devrait fonctionner

Vous n'êtes pas sûr d'avoir copié ou s'il s'agit d'une faute de frappe.

car je suis dans * .txt echo awk '$ 4 ~ / NM / {somme + = 2 $}} FIN {print somme}' $ i; fait

Avec echo corrigé, la commande ci-dessus fera écho à votre script awk et au nom du fichier, mais ne l'exécutera pas.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top