2

У меня есть файл с двумя столбцами, разделенными пробелами, как это:

potato 5
apple 7
pretzel 9

Я хочу выполнить команду в каждой строке, как это:

cmd -f potato -n 5
cmd -f apple -n 7
cmd -f pretzel -n 9

Могу ли я заставить xargs разбить входящую строку и передать эти аргументы команде? xargs даже правильная команда для использования здесь?

2 ответа2

2

Я не думаю, что вы можете сделать это напрямую с помощью xargs, но есть другое решение:

$ cat /tmp/l
potato 5
apple 7
pretzel 9

используя printf:

$ printf 'cmd -f %s -n %s\n' $(</tmp/l)
cmd -f potato -n 5
cmd -f apple -n 7
cmd -f pretzel -n 9

если вам нужно выполнить его, вы можете использовать другой канал для оболочки, как

$ printf 'cmd -f %s -n %s\n' $(</tmp/l) | bash

Еще одно простое и чистое решение awk:

$ awk '{print "cmd -f "$1" -n "$2}' /tmp/l
cmd -f potato -n 5
cmd -f apple -n 7
cmd -f pretzel -n 9

В заключение :

$ awk '{system("cmd -f "$1" -n "$2)}' /tmp/l
2

Если у вас установлен GNU Parallel http://www.gnu.org/software/parallel/, вы можете сделать это:

cat food.txt | parallel --colsep ' ' cmd -f {1} -n {2}

Он также будет работать по одному cmd на ядро процессора параллельно.

Вы можете установить GNU Parallel просто:

wget http://git.savannah.gnu.org/cgit/parallel.git/plain/src/parallel
chmod 755 parallel
cp parallel sem

Посмотрите вступительные видео для GNU Parallel, чтобы узнать больше:https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .