У меня есть скрипт, s1
который выводит список чисел, разделенных ',' например 1,2,3,4
. Теперь я хочу дать эти числа сценарию в s2
качестве аргументов, чтобы s2 запускался на каждом из них и выводил свой результат в отдельной строке. Например, если s2 умножает числа на два, это будет результат, который я ищу:
2
4
6
8
Что я делаю сейчас:
s1 | xargs -d "," | xargs -n1 s2
Но я чувствую, что делаю это так глупо! Итак, мой вопрос:
Как правильно это сделать?
Моя проблема с моим решением состоит в том, что он дважды вызывает xargs и дважды перебирает ввод, что, конечно, не является разумным для меня из-за производительности! Ответ xargs -d "," -n1
кажется хорошим, но я не уверен, что он повторяется только один раз. Если это произойдет, пожалуйста, подтвердите это в своем ответе, и я приму это. Кстати, я бы предпочел не использовать Perl, поскольку он все еще повторяется дважды, а также Perl может не существовать во многих системах.
s1 | xargs -d "," -n1 s2
Ответы:
Это должно одинаково хорошо работать:
Прецедент:
Результат:
Если
s1
выводится этот список с последующим символом новой строки, вы хотите удалить его, так как в противном случае последний вызов был бы4\n
вместо4
:источник
Если вы
s2
можете принять несколько аргументов, вы можете сделать:который временно переопределяет IFS на запятую, все в подоболочке, так что
s2
вывод результатовs1
разбивается запятыми. Подоболочка - это краткий способ изменить IFS без сохранения предыдущего значения или его сброса.Предыдущая версия этого ответа была неверной, возможно, из-за оставшихся настроек IFS, что исказило результаты. Спасибо ilkkachu за указание на мою ошибку .
Чтобы вручную зациклить выходы и предоставить их индивидуально для
s2
, здесь демонстрируется сохранение и сброс IFS:или запустить биты IFS в подоболочке как раньше:
источник
bash -c 'IFS=, printf "%s\n" $(echo 1,2,3)'
печатает1,2,3
на моей системе, т.е. нет разделения./usr/bin/printf
и/bin/echo
(IFS=,; printf "%s\n" $(echo 1,2,3))
, с другой стороны, должно работать.Попробуй это:
источник
tr ',' '\n'
? Не нужно вызывать что-то столь же (относительно) тяжелое, как Perl и регулярные выражения.