getline和awk的奇怪行为

时间:2014-06-09 04:02:44

标签: shell awk base64 getline

我有这个测试文件x1.tmp:

(030) 27 59 55;IDU5
(030) 54 59 70;IDk1
(030) 6 09 83 89;IDk5
(030) 54 71 05;IDkw
(030) 31 80 67;IDUw
(030) 43 60 46;IDE0
(030) 2 81 90;IDIz
(030) 4 25 44;IDI0
(030) 56 70 00;IDUx
(030) 28 39 10;IDU1
(030) 42 02 72;IDAy
(030) 70 76 41;IDc0
(030) 60 97 57;IDUx
(030) 36 99 11;IDU2
(030) 44 71 50;IDIz

这个命令行:

cat x1.tmp|gawk -F\; '{"base64 -d <<<\""$2"\""|getline $3}{print $1,$3}'

结果应该是一个base64解码数字,附加到其他数字,但这不适用于2行,结果如下:

(030) 27 59 55  59
(030) 54 59 70  95
(030) 6 09 83 89  99
(030) 54 71 05  90
(030) 31 80 67  50
(030) 43 60 46  14
(030) 2 81 90  23
(030) 4 25 44  24
(030) 56 70 00  51
(030) 28 39 10  55
(030) 42 02 72  02
(030) 70 76 41  74
(030) 60 97 57 
(030) 36 99 11  56
(030) 44 71 50 

您看,最后一行和倒数第三行缺少已解码的数字。有趣的是,如果我在开头删除一些行,错误的行似乎是正确的。 我不知道为什么。我在awk中也非常非常糟糕。

如果我用cat替换base64 -d命令,我没有得到这行中的第二个字段,所以base64命令本身没问题,问题必须是getline。

我试了几个小时才发现错误,但没有成功。 你的帮助会非常好!

2 个答案:

答案 0 :(得分:2)

根据这个答案gawk / awk: piping date to getline *sometimes* won't work,您应该在打开新管道之前明确关闭管道。

因此,以下代码按预期工作。

cat x1.tmp|gawk -F\; '{"base64 -d <<<\""$2"\""|getline $3;close("base64 -d <<<\""$2"\"")}{print $1,$3}'

答案 1 :(得分:1)

也许你可以在没有getline的情况下以另一种方式解决它:

gawk -F';' '{printf "%s",$1;system("base64 -d <<< "$2);print ""}' x1.tmp

输出:

(030) 27 59 55 59
(030) 54 59 70 95
(030) 6 09 83 89 99
(030) 54 71 05 90
(030) 31 80 67 50
(030) 43 60 46 14
(030) 2 81 90 23
(030) 4 25 44 24
(030) 56 70 00 51
(030) 28 39 10 55
(030) 42 02 72 02
(030) 70 76 41 74
(030) 60 97 57 51
(030) 36 99 11 56
(030) 44 71 50 23