Разделите строку на 3 отдельных аргумента с помощью xargs

Если у меня есть следующее:

$ printf '%s\n' "${fa[@]}"

1 2 3
4 5 6
7 8 9

где каждая строка - это новый элемент массива. Я хочу иметь возможность разделить элемент с помощью разделителя пробела и использовать результат как 3 отдельных параметра и конвейер в xargs.

Например, первый элемент:

1 2 3

где, используя xargs, я хочу передать 1, 2 и 3 в простую команду эха, такую ​​как:

$ echo $0
1
4
7

$ echo $1
2
5
8

$ echo $2
3
9
6

Итак, я пытался сделать это следующим образом:

printf '%s\n' "${fa[@]}" | cut -d' ' -f1,2,3 | xargs -d' ' -n 3 bash -c 'echo $0'

который дает:

1
2
3 4
5
6 7
8
9 10

что помимо странного порядка строк - попытка xargs -d' ' -n 3 bash -c 'echo $0' не распечатывает первый «элемент» каждой строки, т.е.

$ echo $0
1
4
7

а распечатывает их все.

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

Спасибо!


person brucezepplin    schedule 18.04.2015    source источник
comment
Из любопытства, откуда взялся 10 в выводе?   -  person Jonathan Leffler    schedule 19.04.2015
comment
Входной файл на самом деле длиннее (намного длиннее!), Но тот же формат из трех столбцов. Обрезал для удобства пояснения вопроса.   -  person brucezepplin    schedule 19.04.2015


Ответы (1)


Вы двигались в правильном направлении

Чтобы объявить массив:

fa=('1 2 3' '4 5 6' '7 8 9')

Чтобы добиться желаемого:

printf '%s\n' "${fa[@]}" | xargs -n 3 sh -c 'echo call_my_command --arg1="$1" --arg2="$2" --arg3="$3"' argv0

это отразит вам следующие строки (измените команду, которая передается в xargs соответственно)

call_my_command --arg1=1 --arg2=2 --arg3=3
call_my_command --arg1=4 --arg2=5 --arg3=6
call_my_command --arg1=7 --arg2=8 --arg3=9

Если я просто добавлю ваш ответ и немного его изменю, мы получим следующее

printf '%s\n' "${fa[@]}" | cut -d' ' -f1,2,3 | xargs -n 3 bash -c 'echo $0 $1 $2'

обратите внимание на отсутствие -d '' в xargs, этот параметр недоступен в некоторых версиях xargs.

person Tim Rijavec    schedule 18.04.2015