3

这让我发疯。我要做的就是从 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

搞什么鬼。

4

3 回答 3

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"

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

于 2010-02-05T20:54:29.280 回答
2

我发现你的样品有两个问题。你的“echo”应该是“echo”(至少,对我来说,“echo”不起作用),并且你的 printf 缺少格式 arg。

for ( i = 1; i <=NF ; i=i+1 ) { 
   "echo " $i | getline var; 
   printf "%s ", var ; 
 }
于 2010-02-05T20:28:40.637 回答
0

如果你想连接值

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

$var
于 2010-02-05T23:38:57.980 回答