다음 문서 발췌를 고려하십시오.
19610101 060000 0.4 G
19610101 120000 2.3 G
19610101 180000 ... .
19610102 150000
19610102 180000
19610103 060000
........ ......
20150901
가장 왼쪽 열은 날짜를 지정합니다. 1-365/366 사이의 숫자로 연중 날짜를 지정하는 열을 삽입하려면 어떻게 해야 합니까?
각 날짜의 마지막 네 자리(예: 0101,0102,...)를 추출하면 재귀적이고 증가하는 숫자 시퀀스를 얻게 됩니다. 우리는 거기에서 어디로 가는가? 아니면 더 간단한 구현이 있습니까?
답변1
주어진 파일 file
내용
19610101 060000 0.4 G
19610101 120000 2.3 G
19610101 180000 ... .
19610102 150000 ... .
19610102 180000 ... .
19610103 060000 ... .
20150901 ...... ... .
awk
GNU 또는 mawk
(및 둘 다 mktime()
) 를 사용할 수 있습니다 strftime()
.
awk '
{
tspec = sprintf("%4d %.2d %.2d 00 00 00", substr($1,1,4), substr($1,5,2), substr($1,7,2))
t = mktime(tspec)
$(NF+1) = strftime("%j",t)
} { print }' file
t
그러면 파일의 첫 번째 열에서 구문 분석된 날짜를 기반으로 Unix 타임스탬프가 생성됩니다(자정을 시간으로 사용). 그런 다음 format 을 사용하여 strftime()
타임스탬프의 형식을 지정합니다 %j
. 이는 0이 채워진 정수로 올해의 날짜를 제공합니다(참고자료 참조 man strftime
). 숫자가 새 열로 삽입된 다음 행이 인쇄됩니다.
결과:
19610101 060000 0.4 G 001
19610101 120000 2.3 G 001
19610101 180000 ... . 001
19610102 150000 ... . 002
19610102 180000 ... . 002
19610103 060000 ... . 003
20150901 ...... ... . 244
제로 패딩을 제거하려면 를 사용하십시오 $(NF+1) = 0 + strftime(...)
.
답변2
데이터가 동질적인 경우, 예를 들어
$ cat file
Date Time
19610101 060000
19610101 120000
19610101 060000
19610102 120000
19610102 060000
19610102 120000
20150901 060000
그렇다면 Miller( mlr
)가 좋은 선택이 될 수 있습니다.
$ mlr --pprint --fs " " --repifs put -S '
$Day = strftime(strptime($Date,"%Y%m%d"),"%j")
' file
Date Time Day
19610101 060000 001
19610101 120000 001
19610101 060000 001
19610102 120000 002
19610102 060000 002
19610102 120000 002
20150901 060000 244
-S
무제한 필드를 문자열 유형으로 YYYYmmmdd
변환하는 데 사용됩니다 strptime
(기본적으로 정수로 구문 분석됨).