2009-03-09 6 views
0

Je veux appliquer la commande suivante « awk » sur les fichiers avec l'extension « * .txt »Application AWK sur ensemble de fichiers avec extension Même

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.

Répondre

3

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

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

Il échouera s'il y a des fichiers texte avec des espaces en eux, vous pouvez essayer ceci:

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

Une alternative pour l'impression des noms:

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

(Fondamentalement faire trouver exécuter awk directement, ainsi et aussi imprimer les noms de fichiers.

+0

Merci beaucoup. Est-ce qu'il y a un moyen d'imprimer le nom de fichier? – neversaint

0

Vous ne savez pas si vous avez copié le texte ou s'il s'agit d'une faute de frappe.

pour i dans * .txt faire echo awk '$ 4 ~/NM/{somme + = $ 2} FIN {print sum}' $ i; done

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

1

L'écho n'est pas requis.

essayez

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

ou

for i in * txt; awk '$ 4 ~/NM/{somme + = $ 2} FIN {print sum}' $ i; fait

devrait fonctionner

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

Cela affichera les noms des fichiers traités en même temps que la sortie de la commande awk.

+0

"for i in * .txt" est un mauvais style. Ne fonctionnera pas avec des espaces. – porges

+0

Dans Bash, 'for i in * .txt' fonctionne correctement avec les espaces ($ i contient tout le nom de fichier contenant l'espace), mais vous avez raison, cela crée un problème lorsque vous passez $ i comme argument à awk. J'ai ajouté les citations nécessaires autour de $ i maintenant, merci. –

2

Essayez cette (utilisez nawk ou /usr/xpg4/bin/awk sur 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 
2

Vous devez ajouter un ';' :

for i in *.txt; do ... 

au lieu de

for i in *.txt do ... 
Questions connexes