【问题标题】:How to use getline in AWK with a command that is concatenated together如何在 AWK 中将 getline 与连接在一起的命令一起使用
【发布时间】:2011-01-13 16:23:26
【问题描述】:

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

什么鬼。

【问题讨论】:

    标签: awk getline


    【解决方案1】:

    好吧,事实证明这不是错误。

    发生了什么是 getline 打开一个新文件,根据您的系统设置,每个程序只能打开 X 个文件。一旦你最大化打开的文件,getline 就不能打开任何新的 fd。解决方案是您必须致电

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

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 这似乎不是问题,对我来说这似乎是 awk 中的一个真正的错误,如果我使用你的代码,我也会得到奇怪的输出
      【解决方案3】:

      如果你想连接值

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-09-21
        • 2012-08-21
        • 2021-04-06
        • 2012-12-25
        • 1970-01-01
        • 2019-02-18
        • 1970-01-01
        相关资源
        最近更新 更多