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

あなたのサンプルには 2 つの問題が見つかりました。あなたの「エコー」は「エコー」である必要があり(少なくとも、私にとっては「エコー」は機能しませんでした)、printfにはフォーマット引数がありません。

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 に答える