打印作为变量传递的字段列表

时间:2015-09-04 11:18:17

标签: bash shell awk

我有一个文件说a.txt,下面是它的内容:

bob 1 100            
lincoln 2 200  
chris 3 300        

文件内容以空格分隔。

使用awk,我可以访问每一列。使用以下命令 打印以逗号分隔的第1列和第3列:

cat a.txt | awk ' { print $1","$3} '

我成功了。

现在我想从另一个shell脚本动态传递条件。通过说出我的意思 - $1","$3

我尝试了下面的命令,但它没有用。

myvar="$1"   
awk -v a="$myvar"  ' { print a } ' a.txt

但由于$1中有三行,因此打印a.txt 3次。

如何以这种方式将字段列表传递给awk?

3 个答案:

答案 0 :(得分:6)

这里的问题是你传递给awk的变量中的$是按字面解释的 - 它不能用于引用特定的字段。

对于单个字段,您可以使用以下内容:

awk -v field=1 '{ print $field }' file
bob
lincoln
chris

对于多个字段,这有点复杂:

awk -v fields="1 3" 'BEGIN{ n = split(fields,f) }
    { for (i=1; i<=n; ++i) printf "%s%s", $f[i], (i<n?OFS:ORS) }' file
bob 100
lincoln 200
chris 300

字段列表作为字符串传递,该字符串被拆分为数组。然后循环播放数组,使用printf输出每个字段,然后输出字段分隔符OFS或输出记录分隔符ORS,具体取决于它是否为最后一场或不。 要使用逗号分隔字段,您可以将-v OFS=,作为选项传递。

答案 1 :(得分:3)

您需要将分隔的字符串传递给awk,并在awk内使用split分隔该分隔符。

这样的事情应该有效:

awk -v search='1,3' 'BEGIN{split(search, a, ",")}
               {f=""; for (i=1;i in a;i++) {printf "%s%s", f, $a[i]; f=OFS} print ""}' file

<强>输出:

bob 100
lincoln 200
chris 300

答案 2 :(得分:2)

使用已通过逗号分隔列表接受字段位置的cut替代awk解决方案。

cols="1,3"; cut -d" " -f"$cols" a.txt

用逗号分隔输出管道到tr ' ' ','或使用--output-delimiter=","剪切选项。

请注意,这样您就可以灵活地将输入指定为已关闭或开放范围,例如1-32-