2015-04-18 2 views
3

Если я следующее:Split линии на 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?

Спасибо!

+0

Из любопытства, откуда взялся выход '10'? –

+0

Входной файл на самом деле длиннее (гораздо длиннее!), Но тот же формат трех столбцов. Я отрезал его для удобства объяснения вопроса. – brucezepplin

ответ

3

Вы шли в правильном направлении

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

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.