如何使用连接在一起的命令在AWK中使用getline

时间:2010-02-05 20:09:47

标签: awk getline

这让我疯了。我想要做的就是从awk向终端传递命令,其中命令是由其他变量连接在一起的字符串。

awk的文档说明了

之类的内容
"echo" $1 | getline var

应该将$ 1的值放入var。但这种情况并非如此。我在这里错过了什么?

我应该补充说我实际上有一个循环

for ( i = 1; i <=NF ; i=i+1 )
{
    "echo" $i | getline var
     printf var " "
}

printf "\n"

用于输入文件,如

 0 2
 1 2

输出

 0 0
 0 0

到底是怎么回事。

3 个答案:

答案 0 :(得分:8)

嗯,事实证明它不是一个错误。

正在进行的是getline打开一个新文件,根据您的系统设置,每个程序只能打开X文件。一旦你最大限度地打开文件,getline就无法打开任何新的fd。解决方案是你必须致电

for ( i = 1; i <=NF ; i=i+1 )
{
     command="echo" $i
     command | getline var
     close(command)
     printf var " "

}

printf "\n"

当然这是一个微妙的观点,文档中应该有巨大的警告标志!无论如何,我很高兴我解决了它。

答案 1 :(得分:2)

我发现你的样本存在两个问题。你的“回声”应该是“回声”(至少,对我来说“回声”不起作用),而你的printf缺少格式arg。

for ( i = 1; i <=NF ; i=i+1 ) { 
   "echo " $i | getline var; 
   printf "%s ", var ; 
 }

答案 2 :(得分:0)

如果要连接值

var=$(awk 'BEGIN{cmd="command "}
{
  for (i=1;i<=NF;i++){
     cmd = cmd" "$i
  }
}
END {
  # pass to shell
   print cmd  
}' file)

$var