Applicazione di AWK su set di file con la stessa estensione
-
05-07-2019 - |
Domanda
Voglio applicare il seguente " awk " comando sui file con estensione " *. txt "
awk '$4 ~ /NM/{ sum += $2 } END{ print sum }'
Ma perché questo comando non funziona:
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
funzionerebbe.
Soluzione
Dopo aver rimosso l'eco, dovrebbe funzionare:
for i in *.txt do awk '$4 ~ /NM/{ sum += $2 } END{ print sum }' $i; done
Fallirà se ci sono file di testo con spazi, puoi provare questo:
find . -name '*.txt' -print0 | xargs --null -n 1 awk '$4 ~ /NM/{ sum += $2 } END{ print sum }'
Un'alternativa per stampare i nomi:
find . -name '*.txt' -print -exec awk '$4 ~ /NM/{ sum += $2 } END{ print sum }' {} \;
(Fondamentalmente trova find esegui awk direttamente, quindi stampa anche i nomi dei file.
Altri suggerimenti
for i in *.txt; do echo "$i"; awk '$4 ~ /NM/{ sum += $2 } END{ print sum }' "$i"; done
Questo stamperà i nomi dei file elaborati insieme all'output del comando awk
.
Prova questo (usa nawk o / usr / xpg4 / bin / awk su 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
Devi aggiungere un ';' :
for i in *.txt; do ...
anziché
for i in *.txt do ...
l'eco non è richiesto.
prova
per i in * .txt; fare; awk '$ 4 ~ / NM / {sum + = $ 2} END {print sum}' $ i; fatto
o
per i in * .txt; do awk '$ 4 ~ / NM / {sum + = $ 2} END {print sum}' $ i; fatto
dovrebbe funzionare
Non sono sicuro se hai copiato o incollato un errore di battitura.
per i in * .txt fare echo awk '$ 4 ~ / NM / {sum + = $ 2} END {print sum}' $ i; fatto
Con l'eco corretto, il comando sopra farà eco al tuo script awk e al nome del file, ma non lo eseguirà.