Unix Bash – Comment imprimer le nombre de mots immédiatement après le nom du fichier sans saut de ligne

J’essaie d’imprimer les noms de fichiers dans mon répertoire avec le nombre de lignes / mots sur une seule ligne. La façon dont ma sortie est maintenant:

foo.txt

500

bar.txt

210

… Ce que ça devrait être:

foo.txt 500

bar.txt 210 …

Ce à quoi je m’attends à ce que la réponse ressemble à: wc -l | awk {quelque chose}

Voici un moyen simple mais imparfait de le faire:

 wc -l *.txt | awk '$2 != "total" { print $2, $1 }' 

Cependant, si vous avez des espaces dans le nom de fichier, ce qui précède imprimera les noms de fichiers coupés au premier espace. En outre, la vérification de la ligne avec le total est également faible, et se casse spectaculairement pour un fichier appelé “total disaster.txt” (merci @rici pour la critique judicieuse).

Voici une solution beaucoup plus sûre, mais un peu plus longue:

 wc -l *.txt | awk '{ count = $1; sub("^ *[0-9]+ ", ""); if ($0 != "total") print count, $0 }' 

vous pouvez utiliser une boucle simple et awk:

pour i dans * .txt
faire
awk ‘END {printf “% s% d \ n”, FILENAME, NR}’ $ i
terminé

ou, vous pouvez utiliser wc -l comme ceci:

wc -l * .txt | awk ‘$ 2! = “total” {printf “% s% d \ n”, $ 2, $ 1}’

  wc -l *.txt | awk '{print $2,$1}' 

Est-ce que le travail pour l’échantillon fourni dans votre question?

Certains utilisateurs s’inquiètent des espaces inutiles dans le nom du fichier

Ce qui suit devrait fonctionner pour vous:

 for i in *.txt; do echo ${i##*/} `wc -l "$i" | awk '{print $1}'`; done