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