2012-03-16 7 views
0

awk 명령을 사용하여 텍스트 파일의 시간 열을 가장 가까운 5 분 간격으로 변경하려고합니다. 따라서 12:56:59가 12:55:00이됩니다awk를 사용하여 파일 처리하기

다음 명령이 예상대로 작동합니다. 응답 해 주셔서 감사합니다.

head r_SERVER_2012-03-10-12-55-00 | awk -F'^' '{print $7}' | awk '{split($2, a, ":"); printf "%s %s:%02d:00\n", $1, a[1],int(a[2]/5)*5}' 

올바른 결과 :

2012-03-10 12:55:00 

는하지만 나뿐만 아니라 날짜보다 다른 필드를 표시합니다. 다음은 작동하지 않습니다

head r_SERVER_2012-03-10-12-55-00 | awk -F'^' '{print $1, $2, $7, $8}' | awk '{split($2, a, ":"); printf "%s %s:%02d:00\n", $1, a[1],int(a[2]/5)*5}' 

잘못된 결과 :

565 14718:00:00 

그것은해야합니다 ...

565 123 2012-03-10 12:55:00 country 
+0

가능한 가장 가까운 5 분으로 반올림 (http://stackoverflow.com/questions/9718047/round-down-to-nearest-5-minutes) – shellter

답변

2

당신은 단지 하나의 여러 AWK 명령을 필요로하고 있지 않습니다 스크립트에 awk의 FS (필드 구분 기호) 변수를 설정하여 파일에 넣을 수 있습니다.

$ cat foo.awk 
BEGIN { 
    # all fields are separated by^
    FS = "^"; 
} 
{ 
    # $7 is the date and time in the form yyyy-mm-dd hh:mm:ss. 
    # Split at colons to get hours minutes and seconds into a[1] 
    # through a[3]. Round minutes to nearest 5. 
    split($7, a, ":"); 
    a[2] = int(a[2]/5) * 5; 

    # print first and second field, then rounded time, then 8th field. 
    printf "%s %s %s:%02d:00 %s\n", $1, $2, a[1], a[2], $8; 
} 
$ cat input 
565^123^$3^$4^$5^$6^2012-03-10 12:56:59^country 
$ awk -f foo.awk < input 
565 123 2012-03-10 12:55:00 country 
$ 
+0

이것은 정확히 내가 본 것입니다. 한 번 더 요청 ... 모든 공간을 특수 문자로 바꾸려면 sed 's/\/~/g'를 사용합니다. 동일한 awk 프로그램에서이 작업을 수행 할 수 있습니까? – shantanuo

+0

예, 전역 대체 대체를 수행하려면 gsub()을 사용하십시오. 무시할 수있는 대체 횟수를 반환합니다. 예 :'gsub ("", "~");'마지막 printf 앞에 삽입하면 모든 필드의 모든 공백이 대체됩니다. 따라서 '국가'가 '베르제르스탄 국민 공화국'이라면 산출량은'565 123 2012-03-10 12:55:00 Peerples ~ Republic ~ ~ Berzerkistan' 일 것이다. – torek

+0

gsub은 처리 시간을 10 배 증가 시켰습니다. 그래서 그것을 포함하지 마십시오. – shantanuo

관련 문제