使用 xargs 时是否有一种方法可以操纵 stdin 参数的顺序,就像 awk 作为 $0、$1、$2 等那样?

使用 xargs 时是否有一种方法可以操纵 stdin 参数的顺序,就像 awk 作为 $0、$1、$2 等那样?

我正在尝试学习如何使用 xargs 操纵管道流量。很多时候,我需要将命令的输出输入到标准输出无法通过管道输入的命令中。

awk 似乎有一些等效项,当您使用它打印时,用符号 $0 表示整个标准输出,而 $1、$2 等是单独的字段,但我似乎在 xargs 中找不到等效项。

示例:类似这样:标准输出是一个无序的参数列表:

file.txt:

secondfield firstfield thirdfield
secondfield2 firstfield2 thirdfield2
secondfield3 firstfield3 thirdfield3

我想运行如下伪代码:

cat file.txt | xargs myprogram $2 $1 $3

我的程序按照输入字段的顺序获取输入字段,其中应该是第一个字段,第二个字段,然后是第三个字段,但显然我的标准输出是乱序的。 $1 $2 $3 只存在于 awk 中。相当于什么?

(这只是一个简化的示例,但重点是我需要知道如何将我的标准输出流排序到 xargs 中,以防我需要操纵哪些变量在其他复杂命令中的位置(例如 mv)

答案1

如果你这样做:

cat file.txt | xargs myprogram

这就像myprogram被称为:

myprogram secondfield firstfield thirdfield secondfield2 firstfield2 thirdfield2 secondfield3 firstfield3 thirdfield3

除非你的参数真的很长并且无法在命令行上传递。这不是你想要开始的。相反做

cat file.txt | xargs --max-lines=1 myprogram

将会myprogram使用 3 个参数来调用,但字段的顺序错误。如果你不能改变myprogram我会调用一个小Python程序:

#!/usr/bin/env python

import sys
import subprocess

sys.exit(subprocess.call('myprogram', sys.argv[2], sys.argv[1], sys.argv[3]))

通过以下方式:

cat file.txt | xargs --max-lines=1 mypythonprog 

答案2

$ xargs -d '\n' -L1 sh -c 'set $1; echo $2 $1 $3' xx  < file.txt 
firstfield secondfield thirdfield
firstfield2 secondfield2 thirdfield2
firstfield3 secondfield3 thirdfield3

相关内容