0

我想将对任意数量的字段变量的引用传递给 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 中的任意数量的字段变量执行此操作?

4

5 回答 5

1

不,没有awk循环是不可能的,但你可以这样做cut

$ var='1,3,4' 
$ echo 'aa bb cc dd' | cut -d' ' --output-delimiter ':' -f "$var"
aa:cc:dd
于 2013-05-14T14:05:36.073 回答
0
var='$1":"$3":"$4'
echo "aa bb cc dd" | awk  "{print $var}"

这会将您想要的变量作为文字 awk 打印格式传递,即

echo "aa bb cc dd" | awk {print $1":"$3":"$4}
于 2013-05-14T14:10:28.037 回答
0

这是执行您特别要求的最简单和最可靠的方法:

$ var='$1,$3,$4'

$ echo "aa\tbb\tcc\tdd" | awk -F'\t' -v OFS=":" '{print '"$var"'}'
aa:cc:dd

我仍然不会特别推荐这样做,因为可能仍然有一些 $var 的值会让你绊倒。只需传入您想要的字段编号并使用循环打印这些字段

于 2013-05-14T15:57:29.447 回答
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
于 2013-05-14T14:03:11.820 回答
0

您可以利用 awk 的系统功能来实现这一点:

var='$1":"$3":"$4'
echo "aa bb cc dd" | awk -v var="$var" '{system("set -- " $0 "; echo " var)}'

输出:

aa:cc:dd

于 2013-05-14T14:15:20.633 回答