Appliquer AWK sur un ensemble de fichiers avec la même extension
-
05-07-2019 - |
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.
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.