2017-04-13 3 views
1

awk에서 간단한 스크립트를 작성하려고하는데 이상한 결과가 발생하고 이유를 이해할 수 없습니다. 수동 또는 웹에서 단서를 찾을 수 없습니다 : 'gawk의 문자열 연결로 인해 예기치 않은 결과가 발생합니다.

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

되지 않는 이유는 무엇 : 결과

# 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")} }' 

이의 것 : 여기

하면 입력 파일의 마지막 줄에는 끝에 "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 -vet file'을 실행하여 파일에서 무언가가 깨 졌는지 확인하십시오. – fedorqui

답변

1

귀하의 입력 파일의 각 줄의 끝에 제어-M을 가지고 cat -vdos2unix하거나 제거하는 유사한보고 사용

예상 결과가 될 것입니다.

이것은 매우 가깝습니다. 우리가 질문을 얻는 가장 일반적인 문제입니다 .... "cat -v file을 실행하고 게시하기 전에 ^M을 찾으십시오"라는 질문을 던지십시오.

+0

예.하지만 그런 경우에는 일관성을 기대할 것입니다. 왜 모든 줄이 똑같이 보이지 않습니까? : -/ – Pawel

+0

출력 라인과 입력 라인을 혼동하지 마십시오. 입력이 실제로'db0 : keys = 14, expires = 4, avg_ttl = 454226332 '인 INPUT 라인입니다 - 단지 하나의 control-M이 있고'avg_ttl = 454226332 '의 끝에 있습니다. 다른 두 필드의 끝 부분이 아니므로 3 번째 입력란에만 나타나기 때문에 3 번째 출력 줄에만 나타납니다. –

+1

당신은 절대적으로 옳습니다 : facepalm : – Pawel