2017-04-13 75 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

相關問題