awk를 사용하여 날짜 타임스탬프를 12시간에서 24시간으로 변환

awk를 사용하여 날짜 타임스탬프를 12시간에서 24시간으로 변환

다음 구조의 데이터가 포함된 csv 파일로 작업하고 있습니다.

"12345","BLAH","DEDA","0.000","1.111","2.22222","3.3333333,"15/12/2017 4:26:00 PM"

12시간을 24시간으로 변환하고 싶습니다. 다음은 내가 궁극적으로 달성하고 싶은 것을 보여줍니다.

"12345","BLAH","DEDA","0.000","1.111","2.22222","3.3333333,"15/12/2017 16:26:00"

기간 변환 문제를 해결하는 것으로 보이는 다음 질문에 대한 답을 찾았습니다. https://stackoverflow.com/questions/8083973/bash-and-awk-converting-a-field-from-12-hour-to-24-hour-clock-time#8084087

따라서 위와 같이 다음과 같은 과정을 거쳐야 한다고 생각합니다(더 효율적인 방법이 있을 수 있습니다).

  1. 날짜와 시간을 임시로 분리하여 자체 기록으로 저장

    "12345","BLAH","DEDA","0.000","1.111","2.22222","3.3333333,"2017/15/12","오후 4:26:00"

  2. 시간 기록을 대상으로 하고 내가 원하는 24시간 형식으로 변환
  3. 날짜 및 시간 레코드를 단일 레코드로 다시 결합

이를 달성하기 위해 awk를 사용하려고 하는데 첫 번째 부분에서 막혔습니다! awk가 작업에 적합한 도구인가요? 아니면 다른 도구를 추천하시겠습니까?

1단계부터 시작하겠습니다. 날짜조차 정확히 못 정했어요!

awk 'BEGIN {FS=","} { gsub(/[0-9]\{2\}\/[0-9]\{2\}\/[0-9]\{4\}/, "TESTING"); print }' myfile.csv

답변1

여기서는 다음을 사용 합니다 perl.

perl -pe 's{\b(\d{1,2})(:\d\d:\d\d) ([AP])M\b}{
  $1 + 12 * (($3 eq "P") - ($1 == 12)) . $2}ge'

즉, PM(낮 12시 제외)인 경우 시간 부분에 12를 추가하고 12AM을 0으로 변경합니다.

의 경우 awk단어 경계 부분이 수행되지 않으며(따라서 거짓 긍정이 발생할 수 있음 123:21:99 AMERICA) 각 줄이 한 번만 발생한다고 가정합니다.

awk '
  match($0, /[0-9]{1,2}:[0-9]{2}:[0-9]{2} [AP]M/) {
    split(substr($0, RSTART, RLENGTH), parts, /[: ]/)
    if (parts[4] == "PM" && parts[1] != 12) parts[1] += 12
    if (parts[4] == "AM" && parts[1] == 12) parts[1] = 0

    $0 = substr($0, 1, RSTART - 1) \
         parts[1] ":" parts[2] ":" parts[3] \
         substr($0, RSTART + RLENGTH)
  }
  {print}'

답변2

이 솔루션은 각 행의 모든 ​​12시간 형식 항목을 24시간 형식으로 변환합니다.

gawk -F, '
{
    for(i = 1; i <= NF; i++) {
        if($i ~ /:[0-9]{2} [PA]M/) {
            split($i, arr, ":| ")

            if(arr[5] ~ /P/)
                arr[2] += 12 

            $i = sprintf("%s %02d:%02d:%02d\"", arr[1], arr[2], arr[3], arr[4])
        }
    }
    print
}' OFS=, input.txt

입력하다

"12345","BLAH","DEDA","0.000","1.111","2.22222","3.3333333","15/12/2017 4:26:00 PM"
"22345","BLAH","DEDA","0.000","1.111","2.22222","3.3333333","16/12/2017 6:26:00 AM"
"32345","BLAH","DEDA","0.000","1.111","2.22222","3.3333333","17/12/2017 10:00:00 PM"
"42345","BLAH","DEDA","0.000","1.111","2.22222","3.3333333","18/12/2017 11:26:00 AM"
"52345","BLAH","DEDA","0.000","1.111","2.22222","3.3333333","19/12/2017 2:26:00 PM"

산출

"12345","BLAH","DEDA","0.000","1.111","2.22222","3.3333333","15/12/2017 16:26:00"
"22345","BLAH","DEDA","0.000","1.111","2.22222","3.3333333","16/12/2017 06:26:00"
"32345","BLAH","DEDA","0.000","1.111","2.22222","3.3333333","17/12/2017 22:00:00"
"42345","BLAH","DEDA","0.000","1.111","2.22222","3.3333333","18/12/2017 11:26:00"
"52345","BLAH","DEDA","0.000","1.111","2.22222","3.3333333","19/12/2017 14:26:00"

관련 정보