我有一个文件说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?
答案 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-3
或2-