J'ai un fichier avec de nombreuses lignes, et sur chaque ligne j'ai les arguments que je veux passer en parallèle avec un séparateur de tabulation.
J'exécute ce script
cat $hdd_file | grep $ssd | parallel -C 't' clean_and_destroy
Et ça marche, $hdd_file est le nom du fichier, le grep collecte les lignes dont les hdds ont un certain $ssd comme cache, puis le parallèle appelle une fonction qui détruit leur connexion.
Maintenant que j'ai créé de nouvelles partitions sur les ssd nettoyés, j'essaie d'appeler en parallèle comme ceci :
cat $hdd_file | grep $ssd | parallel -C 't' create_new_cache :::+ `seq $partitions_per_ssd`
Ce qui devrait obtenir les arguments du tube et les associer aux nombres donnés, mais ce n'est pas le cas.
cat $hdd_file | grep $ssd | parallel -C 't' create_new_cache ::: {} :::+ `seq $partitions_per_ssd`
J'ai également essayé ceci et cela ne fonctionne toujours pas. Les {} :::+ sont passés en arguments pour une raison quelconque
Réponse acceptée :
GNU parallel
solution :
Exemple input.txt
(pour démonstration) :
a b
c d
e f
grep '^[ac]' input.txt
sera utilisé pour émuler une commande (ou un pipeline) agissant comme un fichier source d'entrée
parallel -C 't' echo :::: <(grep '^[ac]' input.txt) ::: $(seq 1 3)
La sortie :
a b 1
a b 2
a b 3
c d 1
c d 2
c d 3
:::: argfiles
– traiter lesargfiles
comme source d'entrée.:::
et::::
peut être mélangé.
Pour agréger les éléments de chaque source d'entrée – ajoutez --xapply
choix :
parallel -C 't' --xapply echo :::: <(grep '^[ac]' input.txt) ::: $(seq 1 2)
La sortie :
a b 1
c d 2