Bash 在反勾选的AWK表达式中具有命令行参数

Bash 在反勾选的AWK表达式中具有命令行参数,bash,Bash,我有一个脚本,其中我运行了一个管道,最后一个命令是awk,我想在该部分放置一个命令行参数 OUTPUT=`sort -t' ' -k +6,6 -k +7,7 | awk '{print " $1"$0}'` 我希望最后的$1是我在运行脚本时收到的参数,而不是被视为一美元一字符串并由awk命令解析 是否有一个优雅的解决方案,或者我应该只传递awk部分,然后迭代输出的每一行,并添加我想用awk添加的空格和参数?使用-v $: set -- foo # set $1 for this

我有一个脚本,其中我运行了一个管道,最后一个命令是
awk
,我想在该部分放置一个命令行参数

OUTPUT=`sort -t' ' -k +6,6 -k +7,7 | awk '{print "        $1"$0}'`
我希望最后的
$1
是我在运行脚本时收到的参数,而不是被视为一美元一字符串并由
awk
命令解析

是否有一个优雅的解决方案,或者我应该只传递
awk
部分,然后迭代
输出的每一行
,并添加我想用
awk
添加的空格和参数?

使用
-v

$: set -- foo # set $1 for this example
$: awk -v arg1=$1 '{print "        ", arg1, $0}' < someInput
$:set--foo#本例设置$1
$:awk-v arg1=$1'{print',arg1,$0}'
或者没有空间(更像你的空间)

$:awk-v arg1=$1'{print”“arg1$0}'

c、 (在本例中为GNU)

最简单的解决方案是使用“unquote requote”技巧将
$1
移到单引号之外:

OUTPUT=`sort -t' ' -k +6,6 -k +7,7 | awk '{print "        '$1'"$0}'`
如果您还没有执行命令,您可能还想在脚本中的该命令之前取消设置
IFS
,以防止“分词”。否则,
bash
将“编辑”掉所有额外的空白,包括换行符:

IFS=
OUTPUT=`sort -t' ' -k +6,6 -k +7,7 | awk '{print "        '$1'"$0}'`

养成使用
$(command)
而不是反勾号的习惯是个好主意,顺便说一句。有关详细信息,请参阅和。@Shawn甚至不知道这是可能的。谢谢你的提示。这是脆弱的,因为它依赖于
$1
不包含任何字符,这些字符将改变
awk
脚本的解析方式。@chepner它仍然在awk中的双引号内,所以我认为除了嵌入双引号之外,它对任何东西都是脆弱的,我怀疑它是否可能是脆弱的。但这一点是正确的。
IFS=
OUTPUT=`sort -t' ' -k +6,6 -k +7,7 | awk '{print "        '$1'"$0}'`