【问题标题】:String concatenation in gawk produces an unexpected resultgawk 中的字符串连接会产生意想不到的结果
【发布时间】:2017-04-13 22:44:07
【问题描述】:

我正在尝试在 awk 中编写一个简单的脚本,但我得到了奇怪的结果并且不明白为什么。在手册或网络上找不到任何线索:

这是输入文件:

# 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

【问题讨论】:

  • 您的预期结果是什么?请注意,您正在粘贴一个长命令并询问它为什么会产生某些东西,而没有给出任何提示应该做什么。请edit您的问题包括这些相关细节。
  • 另外,由于您使用了两次split(),请考虑设置不同的 FS 以摆脱其中一个。
  • 我的GNU Awk 4.1.3 正常返回预期结果。也许你有一些不好的结局?执行cat -vet file 以查看文件中是否有问题。
  • 不错! :) 所以我投票结束这个问题,因为 这个问题是由无法再复制的问题或简单的印刷错误引起的
  • @fedorqui 感谢伙伴的帮助!

标签: awk gawk


【解决方案1】:

您的输入文件在每一行的末尾都有一个 control-M,使用 cat -v 来查看它并使用 dos2unix 或类似的来删除它们。

到目前为止,这肯定是我们收到的最常见问题......希望我们可以对问题施加一些“在发布前运行 cat -v file 并查找 ^Ms”的要求!

【讨论】:

  • 是的,但在这种情况下,我希望保持一致性 - 为什么不是所有的行看起来都一样? :-/
  • 不要将输出行与输入行混淆。以 control-Ms 结尾的是您的 INPUT 行,因此您的输入实际上是 db0:keys=14,expires=4,avg_ttl=454226332<controlM> - 只有 1 个 control-M,它位于 avg_ttl=454226332<controlM> 的末尾,而不是其他 2 个字段的末尾,所以它只出现在第三个输出行,因为它只出现在第三个输入字段中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-05
  • 1970-01-01
  • 2014-05-04
  • 1970-01-01
相关资源
最近更新 更多