2015-04-18 22 views
3

3个独立的参数。如果我有以下:分割线分成使用xargs的

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

1 2 3 
4 5 6 
7 8 9 

,其中每行是一个新的数组元素。我希望能够通过空格分隔符来分割元素,并将结果作为3个单独的参数使用,并将其转换为xargs。

例如,第一元件是:

1 2 3 

其中使用xargs的我想通过123成一个简单的echo命令,例如:

$ 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' 

通知失踪xargs的-d”',这个选项是不是在xargs的某些版本。