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