Linux awk save命令输出到变量

Linux awk save命令输出到变量,linux,scripting,awk,Linux,Scripting,Awk,我需要在某个文件的每行执行一个命令。例如: file1.txt 100 4 file2.txt 19 8 因此,我的awk脚本需要执行以下操作 command $1 $2 $3 并保存命令$1$2$3的输出,这样system()将不起作用,getline。(如果我这样做的话,我就无法通过管道输出。) 此问题的限制是仅使用awk。(我已经有了bashscriot+awk的解决方案…但我只想让awk…只是想了解更多这方面的信息)使用getline有什么问题 $ ./test.awk test.t

我需要在某个文件的每行执行一个命令。例如:

file1.txt 100 4
file2.txt 19 8
因此,我的
awk
脚本需要执行以下操作

command $1 $2 $3
并保存
命令$1$2$3的输出
,这样
system()
将不起作用,
getline
。(如果我这样做的话,我就无法通过管道输出。)


此问题的限制是仅使用
awk
。(我已经有了bashscriot+awk的解决方案…但我只想让awk…只是想了解更多这方面的信息)

使用
getline有什么问题

$ ./test.awk test.txt # ls -F | grep test test.awk* test.txt # cat test.txt | nl 1 ls -F | grep test 2 cat test.txt | nl 3 cat test.awk # cat test.awk #!/usr/bin/awk -f { cmd[NR] = $0 while ($0 | getline line) output[NR] = output[NR] line RS } END { for (i in cmd) print "# " cmd[i] ORS output[i] } $./test.awk test.txt #ls-F | grep检验 test.awk* test.txt #cat test.txt | nl 1 ls-F | grep测试 2 cat test.txt | nl 3 cat test.awk #cat test.awk #!/usr/bin/awk-f { cmd[NR]=$0 而($0 | getline line)输出[NR]=输出[NR]行RS } 结束{ 对于(i in cmd)打印“#”cmd[i]或输出[i] } Awk的system()函数将字符串传递给/bin/sh,因此如果需要,可以使用重定向操作符,如“>file.out”

awk '{system("command " $1 " " $2 " " $3 ">" $1 ".out");}'
编辑:好的,通过保存,您的意思是进入一个awk变量。那么,ephemient在正确的轨道上。这就是awk的getline所做的,比如shell/perl中的backticks或$(cmd)。事实上,google for awk backticks发现:

您说您不能使用getline,因为这样您就不能使用管道。但是您可以使用tee和文件描述符技巧来解决这个问题。如果/bin/sh为bash,则此选项有效:

{ "set +o posix; command " $1 " " $2 " "  $3  " | tee >(grep foo)"  | getline var; print toupper(var); } # bash-only, and broken.
set+o posix
是必需的,因为awk以
sh
的形式运行bash,这使得它在读取启动文件后进入posix模式。嗯,我没有任何运气让它工作,它需要bash无论如何

好的,这是有效的:


    $ touch foo bar
    $ echo "foo bar" | 
      awk '{ "{ ls " $1 " " $2 " "  $3  " | tee /dev/fd/10 | grep foo > /dev/tty; } 10>&1"  | getline var; print toupper(var); }'
    foo
    BAR

我的实际解决方案是这样做,但我无法将命令的输出发送到变量。您可以通过后续的
readline[…]<$1.out“
循环将输出回。别忘了自己清理一下……我同时使用了一些文件描述符重定向到pipe和getline。这就是你需要的吗?这是bash脚本。当我使用getline时,我无法使用管道命令,例如cat file | process parameters,我只获取cat文件。我这样做是为了用更干净的方式来完成这项任务…最后10行回答了我的问题嗯,我认为这显然是脚本本身运行的演示,但可能不是。