Tengo un script s1
que genera una lista de números separados con ',' por ejemplo 1,2,3,4
. Ahora quiero dar estos números al script s2
como argumentos, para que s2 se ejecute en cada uno de ellos y muestre su resultado en una línea separada. Por ejemplo, si s2 multiplica los números por dos, este sería el resultado que estoy buscando:
2
4
6
8
Lo que estoy haciendo ahora es:
s1 | xargs -d "," | xargs -n1 s2
¡Pero siento que lo estoy haciendo de una manera tan tonta! Entonces mi pregunta es:
¿Cuál es la forma correcta de hacerlo?
¡Mi problema con mi solución es que está llamando a xargs dos veces e iterando sobre la entrada dos veces, lo que no es razonable para mí, por supuesto, por medio del rendimiento! La respuesta xargs -d "," -n1
parece agradable, pero no estoy seguro si solo está iterando una vez. Si es así, verifíquelo en su respuesta y lo aceptaré. Por cierto, prefiero no usar Perl ya que todavía está iterando dos veces y también puede que Perl no exista en muchos sistemas.
s1 | xargs -d "," -n1 s2
Respuestas:
Esto también debería funcionar igualmente:
Caso de prueba:
Resultado:
Si
s1
genera esa lista seguida de un carácter de nueva línea, querrá eliminarla, de lo contrario la última llamada sería en4\n
lugar de4
:fuente
Si
s2
puede aceptar múltiples argumentos, podría hacer:que anula temporalmente IFS para que sea una coma, todo en una subshell, para que
s2
vea la salida de las1
división por comas. El subshell es una forma abreviada de cambiar IFS sin guardar el valor anterior o restablecerlo.Una versión anterior de esta respuesta era incorrecta, probablemente debido a una configuración de IFS sobrante, que corrompe los resultados. Gracias a ilkkachu por señalar mi error .
Para realizar un bucle manual sobre las salidas y proporcionarlas individualmente
s2
, aquí, demostrando el almacenamiento y restablecimiento de IFS:o ejecutar los bits IFS en una subshell como antes:
fuente
bash -c 'IFS=, printf "%s\n" $(echo 1,2,3)'
imprime1,2,3
en mi sistema, es decir, no hay división./usr/bin/printf
y/bin/echo
(IFS=,; printf "%s\n" $(echo 1,2,3))
, por otro lado, debería funcionar.Prueba esto:
fuente
tr ',' '\n'
? No es necesario invocar algo tan (relativamente) pesado como Perl y expresiones regulares.