我需要在某个文件的每一行执行命令。例如:
file1.txt 100 4
file2.txt 19 8
所以我的awk
脚本需要执行类似
command $1 $2 $3
并保存command $1 $2 $3
的输出,因此system()
将不起作用,getline
也不会。 (如果我做这样的话,我就无法输出输出。)
此问题的限制是仅使用awk
。 (我已经有了bashscriot + awk的解决方案......但我只想要awk ......只是为了了解更多信息)
答案 0 :(得分:2)
使用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] }
答案 1 :(得分:0)
awk的system()函数将字符串传递给/ bin / sh,因此如果需要,可以使用重定向运算符,例如“> file.out”。
awk '{system("command " $1 " " $2 " " $3 ">" $1 ".out");}'
编辑:好的,通过保存,你的意思是进入一个awk变量。然后,ephemient正在走上正轨。这就是awk的getline所做的事情,比如shell / perl中的反引号或$(cmd)。事实上,google for awk反引号发现了这个: http://www.omnigroup.com/mailman/archive/macosx-admin/2006-May/054665.html
你说你不能使用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将bash作为sh
运行,这使得它在读取其启动文件后进入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