2010-10-24 15 views
2

Xargs peut être utilisé pour découper le contenu de l'entrée standard en pièces gérables et invoquer une commande sur chaque pièce. Mais est-il possible de savoir de quel morceau il s'agit? Pour donner un exemple:Est-il possible d'obtenir le numéro de segment dans une invocation de xargs?

seq 1 10 | xargs -P 2 -n 2 mycommand

appellera

mycommand 1 2 & 
mycommand 3 4 & 
mycommand 5 6 & 
mycommand 7 8 & 
mycommand 9 10 & 

Mais je voudrais savoir dans mon script "mycommand" qui

mycommand 1 2 

est le traitement de la première pièce/segment, et bientôt. Est-il possible d'accéder à cette information?

p.s. Dans l'exemple simple ci-dessus, je peux juste regarder les chiffres et dire. Mais pour les listes arbitraires, comment accéder à l'information sans réellement injecter le morceau # dans le flux d'entrée?

Répondre

0

Je vois que vous pouvez le faire si vous changez votre entrée et ajoutez le numéro de séquence:

seq 1 10 | perl -ne '$. % 2 and print (($.+1)/2,"\n"); print' | xargs -n3 ... 

On ne sait pas pourquoi vous avez besoin, mais si votre objectif final est de garder la sortie de la même afin que l'entrée, il peut être plus facile à utiliser en parallèle GNU:

seq 1 10 | parallel -j+0 -n2 -k mycommand 

Regarder la vidéo d'intro pour GNU parallèle pour en savoir plus: http://www.youtube.com/watch?v=OpaiGYxkSuQ

Depuis versio n 20101113 parallèle GNU a $ PARALLEL_SEQ qui est réglé sur le numéro de séquence de la commande:

seq 1 10 | parallel -j+0 -n2 -k mycommand \$PARALLEL_SEQ 

Cela peut être exactement ce que vous recherchez.

+0

Merci. J'avais indiqué la possibilité d'injecter l'identifiant de segment avant d'envoyer la séquence à xargs. Puisque xargs et le "injecter" doivent tous deux connaître le split_param, il est peut-être préférable de le lire à partir d'une variable d'environnement exportée. Je voulais juste un paralléliseur imbriqué rapide et sale. Connaître le segment_id me permettrait d'étiqueter le fichier de sortie généré par chaque segment xargs. Mais je pense que Gnu Parallel est la bonne voie à suivre. Je l'ai évité car je suis terrifié par la syntaxe de Perl :) – srean

+0

Regardez la vidéo et vous verrez que vous n'avez pas besoin de savoir quoi que ce soit sur perl pour utiliser GNU Parallel. Si vous savez comment utiliser xargs, vous savez déjà comment utiliser GNU Parallel. –