J'ai une liste de fichiers de base:
grep -wf "file1.txt" "target1.txt" > "result1.txt" grep -wf "file2.txt" "target2.txt" > "result2.txt"
et une liste de fichiers cibles:
target1.txt target2.txt target3.txt
et je souhaite utiliser bash pour exécuter la commande suivante en utilisant une boucle:
file1.txt file2.txt file3.txt
Les fichiers auront tous le même nom en plus de l'entier final, qui sera dans une série (1:22).
4 Réponses :
Avec une boucle for:
for((i=1; i<=22; i++)); do grep -wf "file$i.txt" "target$i.txt" > "result$i.txt" done
Il s'agit d'une version sur une ligne adaptée à la ligne de commande avec extension d'accolades:
for i in {1..22};do grep -wf "file$i.txt" "target$i.txt" > "result$i.txt"; done
Avec un nombre arbitraire de fichier # .txt
et target#.txt
:
#!/usr/bin/env bash shopt -s extglob # Enable extended globbing patterns # Iterate all file#.txt for f in file+([[:digit:]]).txt; do # Extract the index from the file name by stripping-out all non digit characters i="${f//[^[:digit:]]//}" file="$f" target="target$i.txt" result="result$i.txt" # If both file#.txt and target#.txt exists if [ -e "$file" ] && [ -e "$target" ]; then grep -wf "$file" "$target" >"$result" fi done
Faites-les tous en parallèle avec GNU Parallel :
parallel 'grep -wf file{}.txt target{}.txt > result{}.txt' ::: {1..22}
Veuillez consulter: Que dois-je faire lorsque quelqu'un répond à ma question?