awk를 사용하여 yyyymmddhhmmss에 1초를 추가합니다.

awk를 사용하여 yyyymmddhhmmss에 1초를 추가합니다.

일곱 번째 필드가 yyyymmddhhmmss인 이 파일이 있습니다. 이 숫자를 1초씩 늘려야 합니다.

지금까지 나는 알아냈습니다:

awk 'BEGIN{FS=OFS="|"} $7=$7+1 ' <file> 

작동하는 것 같지만... 일곱 번째 필드의 마지막 두 자리 숫자가 "59"인 경우 분명히 "60"으로 대체됩니다.

전체 열을 1초씩 증가시킬 수 있도록 필드가 날짜임을 awk에 알릴 수 있는 방법이 있습니까?

현재 파일

09099458|1|000|41181|0|0|20221130164738|67
82060649|1|000|36827|0|0|20221130172359|67

예상되는 결과

09099458|1|000|41181|0|0|20221130164739|67
82060649|1|000|36827|0|0|20221130172400|67  <- From 17:23:59 to 17:24:00

미리 감사드립니다.

답변1

GNU를 사용 awk하거나@토마스디키mawk1:

$ gawk -F'|' -v OFS='|' '{
   gsub("..", "& ", $7)
   sub(" ", "", $7)
   $7 = strftime("%Y%m%d%H%M%S", mktime($7) + 1)
   print}' < your-file
09099458|1|000|41181|0|0|20221130164739|67
82060649|1|000|36827|0|0|20221130172400|67

호출은 원하는 형식을 얻으려면 첫 번째 공백을 제거 gsub()하십시오 . 후자는 이를 UNIX 시대 시간으로 변환합니다. 1을 추가하고 YYYYmmddHHMMSS로 형식을 변경합니다."20221130164739""20 22 11 30 16 47 39 "sub()"2022 11 30 16 47 39 "mktime()

awk지원하지 않으면 / mktime()언제든지 핵심 모듈을 strftime()사용할 수 있습니다 .perlTime::Piece

perl -MTime::Piece -F'\|' -lase '
  $F[6] = (Time::Piece->strptime($F[6], $format) + 1) -> strftime($format);
  print join "|", @F' -- -format=%Y%m%d%H%M%S < your-file

여기서는 입력 문자열을 날짜로 구문 분석하기 위해 표준 C 함수와 유사한 동일한 이름의 함수를 사용합니다 Time::Piece. strptime()이렇게 하면 솔루션을 다른 날짜 형식에 더 쉽게 적응할 수 있습니다(이동성이 더 높아짐).

둘 다 없는 gawk경우 일부 셸(예: zsh 또는 ksh93)에는 날짜/시간 구문 분석 및 형식 지정 기능이 내장되어 있습니다.mawkperl

예를 들어 에서는 zsh다음과 같을 수 있습니다.

zmodload zsh/datetime
format=%Y%m%d%H%M%S
while IFS='|' read -ru3 -A fields; do
  strftime -rs t $format $fields[7] &&
    strftime -s 'fields[7]' $format $(( t + 1 ))
  print -r -- ${(j[|])fields}
done 3< your-file

1 이후버전 20121129이 글을 쓰는 시점에서 출시는 거의 정확히 10년 전이었습니다.

관련 정보