我想将对任意数量的字段变量的引用传递给awk,并让它为每行打印出每个变量的值,而不使用for循环。
例如,我想做类似的事情:
var=$1":"$3":"$4
echo "aa bb cc dd" | awk -v var=$var '{print var}'
我想输出“aa:cc:dd”。 当我按原样尝试时,我得到1美元的输出:“3美元”:“4美元。是否可以在var中为任意数量的字段变量执行此操作而不执行for循环?
答案 0 :(得分:1)
不能在没有循环的情况下在awk
中执行,但您可以使用cut
执行此操作:
$ var='1,3,4'
$ echo 'aa bb cc dd' | cut -d' ' --output-delimiter ':' -f "$var"
aa:cc:dd
答案 1 :(得分:0)
你想拥有这个:
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
答案 2 :(得分:0)
var='$1":"$3":"$4'
echo "aa bb cc dd" | awk "{print $var}"
这会将您想要的变量作为文字awk打印格式传递 即
echo "aa bb cc dd" | awk {print $1":"$3":"$4}
答案 3 :(得分:0)
您可以利用awk的系统功能来实现这一目标:
var='$1":"$3":"$4'
echo "aa bb cc dd" | awk -v var="$var" '{system("set -- " $0 "; echo " var)}'
<强>输出:强>
AA:CC:DD
答案 4 :(得分:0)
这是执行您特别要求的最简单,最健壮的方式:
$ var='$1,$3,$4'
$ echo "aa\tbb\tcc\tdd" | awk -F'\t' -v OFS=":" '{print '"$var"'}'
aa:cc:dd
我仍然不会特别推荐这样做,因为可能还有一些$ var的值会让你失望。只需传入您想要的字段编号,然后使用循环打印这些字段