
일곱 번째 필드가 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
하거나@토마스디키mawk
1:
$ 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()
사용할 수 있습니다 .perl
Time::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)에는 날짜/시간 구문 분석 및 형식 지정 기능이 내장되어 있습니다.mawk
perl
예를 들어 에서는 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년 전이었습니다.