使用单个变量传递awk中的多个字段变量?

时间:2013-05-14 13:56:30

标签: bash awk

我想将对任意数量的字段变量的引用传递给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循环?

5 个答案:

答案 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的值会让你失望。只需传入您想要的字段编号,然后使用循环打印这些字段