我想将对任意数量的字段变量的引用传递给 awk 并让它打印出每一行的每个变量的值,而不使用 for 循环。
例如,我想做类似的事情:
var=$1":"$3":"$4
echo "aa bb cc dd" | awk -v var=$var '{print var}'
我想要“aa:cc:dd”的输出。当我按原样尝试时,我得到 $1":"$3":"$4. 是否可以在不执行 for 循环的情况下对 var 中的任意数量的字段变量执行此操作?
不,没有awk
循环是不可能的,但你可以这样做cut
:
$ var='1,3,4'
$ echo 'aa bb cc dd' | cut -d' ' --output-delimiter ':' -f "$var"
aa:cc:dd
var='$1":"$3":"$4'
echo "aa bb cc dd" | awk "{print $var}"
这会将您想要的变量作为文字 awk 打印格式传递,即
echo "aa bb cc dd" | awk {print $1":"$3":"$4}
这是执行您特别要求的最简单和最可靠的方法:
$ var='$1,$3,$4'
$ echo "aa\tbb\tcc\tdd" | awk -F'\t' -v OFS=":" '{print '"$var"'}'
aa:cc:dd
我仍然不会特别推荐这样做,因为可能仍然有一些 $var 的值会让你绊倒。只需传入您想要的字段编号并使用循环打印这些字段
你想要这个:
awk -v var="$var" '{n=split(var,a,":");
for(i=1;i<=n;i++)s=s sprintf("%s",$a[i]) (i==n?"":" ");
print s}'
用你的例子测试:
kent$ var="1:3:4"
kent$ echo "aa bb cc dd"|awk -v var="$var" '{n=split(var,a,":");for(i=1;i<=n;i++)s=s sprintf("%s",$a[i]) (i==n?"":" ");print s}'
aa cc dd
您可以利用 awk 的系统功能来实现这一点:
var='$1":"$3":"$4'
echo "aa bb cc dd" | awk -v var="$var" '{system("set -- " $0 "; echo " var)}'
输出:
aa:cc:dd