Chinaunix

标题: awk 调用shell 的奇怪问题 望大神指教。 [打印本页]

作者: crazytomcheng    时间: 2017-02-09 11:37
标题: awk 调用shell 的奇怪问题 望大神指教。
本帖最后由 crazytomcheng 于 2017-02-09 11:43 编辑

-------------------
cat data.txt
var1 var2
1 2
1 2
var1 var2
var4 var5
4 2
5 6
-------------------
cat my.sh
#!/bin/bash
echo $1

如果用system 调用 my.sh 结果如下:
cat data.txt| awk '{system("sh my.sh " $2)}'
var2
2
2
var2
var5
2
6


用 getline 来执行,并赋值给一个awk 变量 结果就变成这样了(可以参考图片):
awk '{x="";("/bin/bash my.sh " $2)|getline x;print x}' data.txt
var2
2


var5

6

------
如果$2 重复了,比如 2 已经出现过了,下面调用的时候,返回就成了空白,不知道什么原因
$2如果是新的值,又会去调用,不明白什么原理,望大神指教。谢谢。






1.png (4.56 KB, 下载次数: 31)

异常:

异常:

2.png (3.83 KB, 下载次数: 35)

正常:

正常:

作者: crazytomcheng    时间: 2017-02-09 11:59
我主要目的是,awk 调用一个shell,传入一个参数,然后结果再做处理,输出。因为如果有重复的传入值,导致结果就没有了。很奇怪这个现象,不明白原理。
作者: crazytomcheng    时间: 2017-02-09 11:59
我主要目的是,awk 调用一个shell,传入一个参数,然后结果再做处理,输出。因为如果有重复的传入值,导致结果就没有了。很奇怪这个现象,不明白原理。
作者: crazytomcheng    时间: 2017-02-09 11:59
我主要目的是,awk 调用一个shell,传入一个参数,然后结果再做处理,输出。因为如果有重复的传入值,导致结果就没有了。很奇怪这个现象,不明白原理。
作者: haooooaaa    时间: 2017-02-09 12:28
  1. root@test:/tmp/test# awk '{"bash x.sh "$1|getline x;close("bash x.sh "$1); print x}' a
  2. var1
  3. 1
  4. 1
  5. var1
  6. var4
  7. 4
  8. 5
  9. root@test:/tmp/test# awk '{"bash x.sh "$2|getline x;close("bash x.sh "$2); print x}' a   
  10. var2
  11. 2
  12. 2
  13. var2
  14. var5
  15. 2
  16. 6
  17. root@test:/tmp/test# cat a
  18. var1 var2
  19. 1 2
  20. 1 2
  21. var1 var2
  22. var4 var5
  23. 4 2
  24. 5 6
复制代码

作者: moperyblue    时间: 2017-02-09 13:14

awk '{cmd="/bin/bash my.sh "$2;cmd|getline x;print x;close(cmd)}' data.txt
作者: crazytomcheng    时间: 2017-02-09 14:30
回复 6# moperyblue

谢谢!确实可以,是因为我变量用法有问题的吗,每次都要清空?
作者: crazytomcheng    时间: 2017-02-09 14:33
回复 5# haooooaaa

谢谢!确实可以。

作者: moperyblue    时间: 2017-02-09 15:51
回复 7# crazytomcheng


man awk
=>
       NOTE: If using a pipe, co-process, or socket to getline, or from print or printf within a loop, you must use close() to create  new  instances  of  the  command  or
       socket.  AWK does not automatically close pipes, sockets, or co-processes when they return EOF.
作者: crazytomcheng    时间: 2017-02-09 17:07
回复 9# moperyblue

十分感谢指导!明白了。。。





欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2