다음과 같은 데이터 열이 포함된 여러 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
변수를 인쇄합니다.( ... ) > newfile
printf
: 이렇게 하면 전체 명령이 하위 셸에서 실행되므로 첫 번째 명령 및 루프의 출력을 캡처하여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의 오프셋으로 계산합니다.gdate
date
그런 다음 입력에서 읽은 데이터와 함께 계산된 날짜를 탭으로 구분된 두 개의 열에 올바른 형식으로 출력합니다.