두 열을 기준으로 파일을 비교하고 필드를 추가합니다.

두 열을 기준으로 파일을 비교하고 필드를 추가합니다.

"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 datebash(또는 으로 대체를 처리하는 모든 쉘 ) 그리고 질문의 첫 번째 예제 데이터와 같이 <(...)데이터가 파일에 저장되어 있다고 가정합니다.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와 함께 사용됩니다 .trYYYY-MM-DD
  • date이는 옵션을 통해 일괄 처리를 위해 GNU에 전달됩니다 -f. 출력으로 형식을 사용하여 날짜를 요청합니다 %Y %j. %Y는 양식에 있는 연도 YYYY이고 %j양식에 있는 연도의 날짜입니다 DDD.
  • cut이는 단일 공백을 구분 기호로 사용하여 원본 파일(두 번째 에서 생성됨)의 마지막 두 열과 함께 붙여넣습니다 .

이는 생성한 인덱스 파일이 필요 없이 원본 데이터에서 최종 결과로 직접 변환되는 것입니다.

관련 정보