테이블에 열 추가

테이블에 열 추가

다음과 같은 데이터 열이 포함된 여러 ASCII 파일이 있습니다.

DATA
1564
1896
1238
1479
1562
1894
1489
....

날짜가 포함된 열을 구현해야 합니다. 각 데이터 세트는 1900-01-01(년-월-일)부터 시작한다는 것을 알고 있습니다. 따라서 각 파일을 다음과 같이 다시 포맷하고 싶습니다.

DATE DATA
1900-01-01 1564
1900-01-02 1896
1900-01-03 1238
1900-01-04 1479
1900-01-05 1562
1900-01-06 1894
1900-01-07 1489
.....

어떻게 해야 하나요?

답변1

GNU에 액세스할 수 있는 경우 date다음을 수행할 수 있습니다.

$ ( date="1899-12-31"; printf 'DATE\tDATA\n';  
    tail -n+2 file | 
        while read line; do 
            date="$(date -d "$date + 1 day" +%F)" 
            printf '%s\t%s\n' "$date" "$line"
        done; ) > newfile

설명하다

  • date="1899-12-31": 변수를 $date시작일에서 1일을 뺀 날짜로 설정합니다.
  • printf 'DATE\tDATA\n';: 열 헤더를 인쇄합니다.
  • tail -n+2 file |:파일의 첫 번째 줄(헤더)을 제외한 모든 항목을 인쇄하여 루프에 전달합니다 while.
  • while read line; do ... ; done: 각 입력라인을 처리하여 $line.
  • date="$(date -d "$date + 1 day" +%F)": 값에 1일을 추가합니다 $date.
  • printf '%s\t%s\n' "$date" "$line": 현재 값 $date$line변수를 인쇄합니다.
  • ( ... ) > newfileprintf: 이렇게 하면 전체 명령이 하위 셸에서 실행되므로 첫 번째 명령 및 루프의 출력을 캡처하여 newfile.

답변2

#!/bin/bash

printf "DATE\tDATA\n"

offset=0

sed -n '2,$p' |
while read data; do
        thedate=$( gdate -d "1900-01-01 + $offset days" +"%F" )
        printf "%s\t%s\n" "$thedate" "$data"
        (( ++offset ))
done

이 작은 스크립트가 사용됩니다

$ bash script.sh <data
DATE    DATA
1900-01-01  1564
1900-01-02  1896
1900-01-03  1238
1900-01-04  1479
1900-01-05  1562
1900-01-06  1894
1900-01-07  1489

헤더를 인쇄하고 입력 파일(헤더 " DATA" 포함)의 첫 번째 입력 줄을 건너뜁니다.

이는 GNU(내 시스템에서 호출됩니다 date. 시스템에서만 호출되는 경우 해당 행을 변경하십시오)를 사용하여 현재 행의 날짜를 1900-01-01의 오프셋으로 계산합니다.gdatedate

그런 다음 입력에서 읽은 데이터와 함께 계산된 날짜를 탭으로 구분된 두 개의 열에 올바른 형식으로 출력합니다.

관련 정보