2014-10-30 3 views
1

에서 '시스템'명령의 출력을 얻을 필드가 20141028 20:49:49 같은 타임 스탬프입니다 방법을, 나는 시간 20을 얻고 싶은, 그래서 system 명령을 사용합니다내가 파일이 AWK

hour=system("date -d\""$5"\" +'%H'") 

타임 스탬프는 내 파일의 다섯 번째 필드이므로 $5을 사용했습니다. 그러나 프로그램을 실행할 때 위의 명령을 찾았을 때 20을 출력하고 hour is 0 but not 20을 반환하므로 제 질문은 시간 소인에서 시간을 얻는 방법입니다.

나는 split 기능이 같은 두 번 사용하는 방법을 알고 :

split($5, vec, " ") 
split(vec[2], vec2, ":") 

을하지만이 방법은 조금 비효율적이고 추악한입니다.

다른 해결책이 있습니까? 감사합니다

+0

가능한 복제본 [그녀에게 전화 ll 명령을 awk 내부에서 실행하고 awk 변수를 쉘 명령에 전달하십시오.] (http://stackoverflow.com/questions/20646819/call-a-shell-command-from-inside-awk-and-pass-some-awk- 변수 - 투 - 쉘 - 공동) –

+0

특히, [이 답변] (https://stackoverflow.com/questions/20646819/call-a-shell-command-from-inside-awk-and-pass-some- awk-variables-to-the-shell-co/20648953 # 20648953). –

+1

@ nu11p01n73R 내 실수, 이미 고침 감사합니다 – ningyuwhut

답변

2

명령을 사용하지 않고 substr 함수를 사용하여 시간을 추출 할 수 있습니다.

awk {'print substr("20:49:49",1,2)}' 

$ awk {'print substr("20141028 20:49:49",10,2)}' 
20 

substr(str, pos, len) 위치 pos와 아이폰에에 str에서 문자열을 추출하여 출력

20 

또는 더 구체적 문제로 생산됩니다 예를 들어

$5의 값이 20141028 20:49:49 경우,

$ awk {'print substr($5,10,2)}' 
20 
2

또 다른 방법은 gawk를 사용하여 :

gawk 'match($5, " ([0-9]+):", r){print r[1]}' input_file 

어떻게 awk에서 프로세스 출력을 externall 관리 알고 싶다면 :

awk '{cmd="date -d \""$5"\" +%H";cmd|getline hour;print hour;close(cmd)}' input_file 
+0

+1 : 'getline 사용'답변이 더 명확해야하지만. –

+0

감사합니다. 그러나이 명령을 실행하면'usage : date [-nnn] [-d dst] [-r 초] [-t west] [-v [+ | -] val [ymwdHMS]] 오류가 발생합니다. .. [-f fmt date | – ningyuwhut

+0

네, 네 말이 맞다. 나는 기계를 바꿨다. 그리고 그 대답을 얻는다! [[mm] dd] HH] MM [[cc] yy] [. ss]] [+ format] 그러나'cmd = "date -d \" "$ 5"\ "+ % H"'에 대해 설명 할 수 있습니까? 백 슬래시는 무엇입니까? 감사 – ningyuwhut