2017-11-14 23 views
1

I는 전류 출력이 (-d 및 -r 옵션은 AIX에서 지원되지 않습니다)와 같은가의 strftime 또는 날짜 명령없이 유닉스 시간을 변환하는 awk가

는 이러한 유닉스 시간을 가져야한다 출력은 사람이 읽을 수로 변환 예상 ​​

file | awk '$1=="IMAGE" {print $2","$7","$14","$17","$19/1000}' 

ABC,POL1,1510009167,1510009677,20.5 
DEF,POL2,1510009667,1510009887,20.5 
XYZ,POL3,1510007867,1510009887,20.5 
PQR,POL4,1510009267,1510009997,20.5 
형식에서는 AIX에서 지원되지 않으므로 strftime or date -d 옵션을 사용할 수 없습니다. 변환 할 수 있지만 awk에서 사용할 수없는 사용자 정의 명령이 있습니다. 함수를 작성한 다음 도움이되지 않은 awk에서 사용했습니다.

에드의 코드 사용자 정의 명령으로 출력하면 다음과 같은 결과가 나옵니다. 그러나 나에게 하루/월/년 만 제공하고 싶습니다. awk를 사용하여이 명령을 사용자 명령에서 인쇄 할 수는 있지만이 함수에서 사용합니까?

ABC POL1 1510009167 = Mon Nov 6 17:59:27 EST 2017 1510009677 = Tue Nov 7 04:37:57 IST 2017 20.5 
DEF POL2 1510009667 = Mon Nov 6 18:07:47 EST 2017 1510009887 = Tue Nov 7 04:41:27 IST 2017 20.5 
XYZ POL3 1510007867 = Mon Nov 6 17:37:47 EST 2017 1510009887 = Tue Nov 7 04:41:27 IST 2017 20.5 
PQR POL4 1510009267 = Mon Nov 6 18:01:07 EST 2017 1510009997 = Tue Nov 7 04:43:17 IST 2017 20.5 
+0

이 필요하다. – karakfa

답변

1

인 당신이 오늘 전화로 :

command -ctime $14 | awk '{print $4"/"$5"/"$6"/"} 

는 형식을 얻으려면 당신이 원한다면 awk 함수를 써서 호출하면된다. 변환 루틴을 이미 awk에서 호출했다면,

awk ' 
function secs2time(secs,  cmd, line, flds, time) { 
    cmd = "command -ctime \"" secs "\"" 
    if ((cmd | getline line) > 0 ) { 
     split(line,flds," ") 
     time = flds[4] "/" flds[5] "/" flds[6] "/" 
    } 
    else { 
     time = "error:" secs 
    } 
    close(cmd) 
    return time 
} 
BEGIN { FS=OFS="," } 
$1=="IMAGE" {print $2, $7, secs2time($14), secs2time($17), $19/1000} 
' 
+0

응답 주셔서 감사합니다, 여기에 사용자 정의 명령으로 바로 cmd를 참조하고 있습니까? – Sid

+0

이게 잘 작동 하나만 필요합니다. 사용자 정의 명령의 정확한 출력을 원하지 않습니다.'1510009167 = Mon 11 월 6 일 17:59:27 EST 2017' 대신 사용자 정의 출력을 awk로 출력합니다 명령, 어떻게 지금 사용합니까? '명령 -ctime $ 14 | awk '{print $ 4 "/"$ 5 "/"$ 6 "/"} " – Sid

+0

질문을 편집했습니다. – Sid

1

GNU AWK는 내장 strftime() 기능을 가지고 있지만, 그 대부분 AIX에 당신에게 사용할 수 없습니다. 대신 AWK의

시도 펄 :

perl -MPOSIX=strftime -F, -ane ' 
    $F[2] = strftime("%Y-%m-%dT%H:%M:%S", localtime($F[2])); 
    $F[3] = strftime("%Y-%m-%dT%H:%M:%S", localtime($F[3])); 
    print join ",", @F 
' <<END 
ABC,POL1,1510009167,1510009677,20.5 
DEF,POL2,1510009667,1510009887,20.5 
XYZ,POL3,1510007867,1510009887,20.5 
PQR,POL4,1510009267,1510009997,20.5 
END 
ABC,POL1,2017-11-06T17:59:27,2017-11-06T18:07:57,20.5 
DEF,POL2,2017-11-06T18:07:47,2017-11-06T18:11:27,20.5 
XYZ,POL3,2017-11-06T17:37:47,2017-11-06T18:11:27,20.5 
PQR,POL4,2017-11-06T18:01:07,2017-11-06T18:13:17,20.5 
1

이미, 날짜 변환 루틴이 명령에 포장하고 데이터를 사용하여 awk

에서 호출하면

$ awk -F, '{"./todate.sh " $3 | getline $3}1' file 

ABC POL1 Mon Nov 6 17:59:27 EST 2017 1510009677 20.5 
DEF POL2 Mon Nov 6 18:07:47 EST 2017 1510009887 20.5 
XYZ POL3 Mon Nov 6 17:37:47 EST 2017 1510009887 20.5 
PQR POL4 Mon Nov 6 18:01:07 EST 2017 1510009997 20.5 

여기서, d 먹고 내가 사용하는 변환은 사용자가 당신이 당신의 PATH에 있어요 "명령"라는 이름의 실행 파일에 언급 명령을 정의 가정

==> todate.sh <== 

#!/bin/bash  
date -d "@$1" 
+0

이것이 작동하는 것 같습니다. 둘 이상의 열에 어떻게 사용하고 변환 된 열과 함께 선택적 열만 인쇄합니까? – Sid

+0

은 다른 날짜 필드에도 동일하게 적용됩니다. 마지막에'1'을 제거하고 대신 스크립트에서했던 것처럼 선택된 필드를 출력하십시오. – karakfa