![파일 기반의 두 열을 비교하고 필드를 추가합니다.](https://linux55.com/image/112181/%ED%8C%8C%EC%9D%BC%20%EA%B8%B0%EB%B0%98%EC%9D%98%20%EB%91%90%20%EC%97%B4%EC%9D%84%20%EB%B9%84%EA%B5%90%ED%95%98%EA%B3%A0%20%ED%95%84%EB%93%9C%EB%A5%BC%20%EC%B6%94%EA%B0%80%ED%95%A9%EB%8B%88%EB%8B%A4..png)
열별 날짜와 시간에 "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
1년 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의 네 번째 열을 file1의 세 번째 열에 추가하고 결과는 다음과 같습니다.
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
단일 공백을 구분 기호로 사용하여 원본 파일의 마지막 두 열(두 번째 파일에서 생성됨)과 함께 붙여넣습니다.
이는 생성한 인덱스 파일이 필요 없이 원시 데이터를 최종 결과로 직접 변환하는 것입니다.