"YYYY MM DD HHMM" 형식의 열별 날짜 및 시간과 변수(온도)가 포함된 파일이 있고 이를 YYYY DDD 형식으로 변환하고 시간과 온도를 그대로 유지하려고 합니다. 다음과 같이 보이지만 동일한 날짜가 파일에 여러 번 나타납니다.
1980 01 01 0100 3.3
1982 04 11 0400 2.2
1985 12 04 0700 1.7
1995 12 31 1000 2.2
DDD(마지막 열)의 누적 일수를 얻기 위해 첫 번째 파일의 각 날짜에 추가할 일수를 포함하는 인덱스 파일(1980-2017)을 만들었습니다. 첫 번째 해는 다음과 같습니다(1980년은 윤년이었습니다).
1980 01 31 000
1980 02 29 031
1980 03 31 060
1980 04 30 090
1980 05 31 121
1980 06 30 152
1980 07 31 182
1980 08 31 213
1980 09 30 244
1980 10 31 274
1980 11 30 305
1980 12 31 335
나는 처음 두 열을 기반으로 두 파일을 비교하려고 시도하고 있으며 일치하면 file2의 네 번째 열을 파일 1의 세 번째 열에 추가하고 다음과 같이 끝납니다.
1980 001 0100 3.3
1982 101 0400 2.2
1985 346 0700 1.7
1995 365 1000 2.2
파일의 두 열을 비교하고 아래 awk를 사용하여 두 열을 추가했습니다.
awk -F' ' 'NR==FNR{c[$1$2]++;next};c[$1$2] > 0' junktemp matrix_sample | awk '{print $1, $3+$4}'
하지만 이렇게 하면 $4와 $5(시간 및 온도)가 손실됩니다. 두 개의 awk 함수를 결합하여 결과적으로 file1의 $4와 $5를 얻을 수 있는 방법이 있습니까? 도움을 주시면 감사하겠습니다.
답변1
1년 동안의 잠재적 일치 항목만 제공했기 때문에 테스트하기는 어렵지만
awk 'NR==FNR{c[$1$2]=$4; next} ($1$2 in c) {$3 = sprintf("%03d", $3 + c[$1$2])} {print $1, $3, $4, $5}' file2 file1
1980 001 0100 3.3
1982 11 0400 2.2
1985 04 0700 1.7
1995 31 1000 2.2
답변2
GNU date
및 bash
(또는 으로 대체를 처리하는 모든 쉘 ) 그리고 질문의 첫 번째 예제 데이터와 같이 <(...)
데이터가 파일에 저장되어 있다고 가정합니다.file
$ paste -d ' ' <( date -f <( cut -d ' ' -f1-3 file | tr ' ' '-' ) +"%Y %j" ) \
<( cut -d ' ' -f4-5 file )
1980 001 0100 3.3
1982 101 0400 2.2
1985 338 0700 1.7
1995 365 1000 2.2
- 첫 번째는 입력 데이터의 처음 세 열에 있는 날짜를 형식으로 변환하는 데
cut
와 함께 사용됩니다 .tr
YYYY-MM-DD
date
이는 옵션을 통해 일괄 처리를 위해 GNU에 전달됩니다-f
. 출력으로 형식을 사용하여 날짜를 요청합니다%Y %j
.%Y
는 양식에 있는 연도YYYY
이고%j
양식에 있는 연도의 날짜입니다DDD
.cut
이는 단일 공백을 구분 기호로 사용하여 원본 파일(두 번째 에서 생성됨)의 마지막 두 열과 함께 붙여넣습니다 .
이는 생성한 인덱스 파일이 필요 없이 원본 데이터에서 최종 결과로 직접 변환되는 것입니다.