【问题标题】:Split line into 3 separate arguments using xargs使用 xargs 将行拆分为 3 个单独的参数
【发布时间】:2015-06-25 13:21:54
【问题描述】:

如果我有以下情况:

$ 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 引用的三个单独的参数?

谢谢!

【问题讨论】:

  • 出于好奇,输出中的10 是从哪里来的?
  • 输入文件实际上更长(更长!),虽然相同的三列格式。为了方便解释问题,我把它删掉了。

标签: bash parallel-processing xargs


【解决方案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'

注意 xargs 中缺少 -d' ',此选项在某些版本的 xargs 中不可用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-14
    • 1970-01-01
    • 1970-01-01
    • 2011-05-03
    • 1970-01-01
    相关资源
    最近更新 更多