파일에 1-365/366 사이의 숫자로 연도를 추가하세요.

파일에 1-365/366 사이의 숫자로 연도를 추가하세요.

다음 문서 발췌를 고려하십시오.

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   ......  ...  .

awkGNU 또는 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(기본적으로 정수로 구문 분석됨).

관련 정보