Il semble que vous ayez une simple coquille dans votre citation shell ; cela devrait fonctionner :
for f in *; do awk -F '\t' '{sum += $11} END {print sum}' -- "$f"; done
(le --
n'est nécessaire que pour se protéger contre l'un des noms de fichiers commençant par un trait d'union ; une variable appelée i
est généralement un nombre entier selon l'ancienne convention Fortran ; l'utiliser pour une chaîne de caractères est donc un peu pervers) ; ou encore
ls | while read -r f; do awk -F '\t' '{sum += $11} END {print sum}' -- "$f"; done
si vous voulez éviter le risque de vous heurter à la limite de la longueur de la ligne de commande (qui est grande mais finie sur les systèmes actuels), bien que cela soit cassé si vos noms de fichiers contiennent des sauts de ligne (pourquoi ? !..).
Si vous voulez tout faire en une seule invocation Awk, vous pouvez garder la trace des fichiers en utilisant FNR (nombre d'enregistrement dans le fichier) et FILENAME :
awk -F '\t' 'FNR==1 {if (f) print sum; sum = 0; f = FILENAME} END {print sum} {sum += $11}' -- *
ou alternativement (peut invoquer awk une ou plusieurs fois)
ls | xargs awk -F '\t' 'FNR==1 {if (f) print sum; sum = 0; f = FILENAME} END {print sum} {sum += $11}' --
avec les mêmes réserves que ci-dessus.
Vous pouvez vous prémunir contre les nouvelles lignes dans les noms de fichiers en abandonnant POSIX et en utilisant des GNUismes qui séparent les éléments avec des NULs (interdits dans les noms de fichiers) au lieu de nouvelles lignes (non interdites), mais à moins que votre script doive s'exécuter dans un environnement vraiment hostile, cela ne vaut probablement pas la peine.