Imprimer une déclaration avant chaque sortie de mon script

J’ai un script qui vérifie chaque mot dans un dossier pour le mot “Auteur”, puis imprime le nombre de fois, une ligne par fichier, dans l’ordre croissant. Au total, j’ai 825 fichiers. Un exemple de sortie serait

53 22 17 

Je veux faire en sorte que j’imprime quelque chose avant chaque numéro sur chaque ligne. Ce sera l’hôtel hotel_$i ainsi l’exemple ci-dessus serait maintenant:

 hotel_1 53 hotel_2 22 hotel_3 17 

J’ai essayé de le faire en utilisant une boucle for dans mon script shell:

 for i in {1..825} do echo "hotel_$i" find . -type f -exec bash -c 'grep -wo "Author" {} | wc -l' \; | sort -nr done 

mais cela imprime essentiellement hotel_1 , puis effectue la recherche et le sorting pour tous les 825 fichiers, puis hotel_2 répète la recherche et le sorting, etc. Comment puis-je le faire pour qu’il imprime avant chaque sortie?

Vous pouvez utiliser la commande paste , qui combine des lignes provenant de différents fichiers:

 paste <(printf 'hotel_%d\n' {1..825}) \ <(find . -type f -exec bash -c 'grep -wo "Author" {} | wc -l' \; | sort -nr) 

(Il suffit de mettre ceci sur deux lignes pour une meilleure lisibilité, cela peut être une seule ligne sans le \ .)

Cela combine le paste avec la substitution de processus , ce qui fait que la sortie d'une commande ressemble à un fichier (un canal nommé) à paste .

La première commande hotel_1 hotel_2 une ligne hotel_1 , hotel_2 etc., et la seconde commande est votre commande find .

Pour les fichiers d'entrée courts, la sortie ressemble à ceci:

 hotel_1 7 hotel_2 6 hotel_3 4 hotel_4 3 hotel_5 3 hotel_6 2 hotel_7 1 hotel_8 0 hotel_9 0