Как использовать getline в AWK с командой, объединенной вместе - PullRequest
3 голосов
/ 05 февраля 2010

Это сводит меня с ума. Все, что я хочу сделать, это передать команду терминалу из awk, где команда представляет собой строку, соединенную вместе из других переменных.

В документации к awk сказано, что что-то вроде

"echo" $1 | getline var

следует поместить значение $ 1 в переменную. Но это не так. Что мне здесь не хватает?

Я должен добавить, что у меня действительно есть цикл

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 ]

8 голосов
/ 05 февраля 2010

Ну, оказывается, это не ошибка.

Происходит следующее: getline открывает новый файл, и в зависимости от настроек вашей системы вы можете открыть только X-файлы для каждой программы. Как только вы максимизируете количество открытых файлов, getline не может открывать новые файлы. Решение заключается в том, чтобы позвонить

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

}

printf "\n"

Конечно, это тонкий момент, и в документации об этом должно быть огромных предупреждающих знаков! В любом случае, я просто рад, что решил это.

2 голосов
/ 05 февраля 2010

Я обнаружил две проблемы с вашим образцом. Ваше «echo» должно быть «echo» (по крайней мере, для меня «echo» не сработало), а ваш printf отсутствует формат arg.

for ( i = 1; i <=NF ; i=i+1 ) { 
   "echo " $i | getline var; 
   printf "%s ", var ; 
 }
0 голосов
/ 06 февраля 2010

, если вы хотите объединить значения

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

$var
...