2017-04-13 69 views
1

我想在awk中编写一个简单的脚本,但是我得到了奇怪的结果,无法理解为什么。无法找到在手册或网页的任何线索:gawk中的字符串串联会产生意想不到的结果

这里的输入文件:

# Keyspace 
db0:keys=14,expires=4,avg_ttl=454226332 

这里的命令

gawk -F : '/^db/ { split($2, keys, ","); for(i in keys) { k = gensub("=", ":", "g", keys[i]); print ("redis." $1 "." k "Z")} }' 

这里的结果:

redis.db0.keys:14Z 
redis.db0.expires:4Z 
Zedis.db0.avg_ttl:454226332 

为什么没有按”最后一行在最后有一个“Z”?如果我使用gawk或awk(Mac),则无关紧要。

预期的结果将是:

redis.db0.keys:14Z 
redis.db0.expires:4Z 
redis.db0.avg_ttl:454226332Z 
+0

您的预期成果是什么?请注意,你正在粘贴一个长长的命令,并问为什么它会产生一些东西,而没有给出它所要做的事情。请[编辑]您的问题以包含相关的详细信息。 – fedorqui

+0

也是,因为你使用'split()'两次,考虑设置一个不同的FS去除其中的一个。 – fedorqui

+1

我的'GNU Awk 4.1.3'正常返回预期的结果。也许你有一些不好的结局?执行'cat -vevet file'来查看文件中是否有内容被破坏。 – fedorqui

回答

1

输入文件在每个行结束的控制-M,采用cat -v看到它和dos2unix或类似的将其删除。

这有GOT是由FAR最常见的问题,我们得到的问题有关....希望有一些“运行cat -v file和寻找^M s发布之前”的要求,我们可以强加在问题!

+0

是的,但在这样的情况下,我期望一致性 - 为什么不是所有的线看起来都一样? : -/ – Pawel

+0

不要混淆输出线和输入线。这是你的INPUT行以control-Ms结尾,所以你的输入实际上是'db0:keys = 14,expires = 4,avg_ttl = 454226332 ' - 只有一个control-M,它在'avg_ttl = 454226332 ' ,而不是在其他两个字段的末尾,所以它只出现在第三个输出行中,因为它只出现在第三个输入字段中。 –

+1

你是完全正确的:facepalm: – Pawel

相关问题