파일 이름에 대한 헤더 업데이트

파일 이름에 대한 헤더 업데이트

다음과 같은 이름의 파일이 여러 개 있습니다(예로 2개의 이름만 제공했습니다)(참고: 세미콜론 필드 ;구분 기호가 있습니다).

component1_component2_component3.csv

예를 들어

almourol_gfdl_85.csv
almourol_had_85.csv

각 테이블은 다음과 같이 구성됩니다.

YEAR;MONTH;DAY;WFDisi;SWIM;GAP3;HYPE;VIC
1971;01;01;1206.1;627;1252.6;909;357.6
1971;01;02;1303.4;654.3;1397.4;916;478.5
1971;01;03;1248.9;662;1318.8;951;653.1

처음 세 개의 열은 항상 동일하지만 열 수는 변경될 수 있으며 때로는 테이블이 다음과 같이 표시됩니다.

YEAR;MONTH;DAY;ECOMAG;HYPE
1971;01;01;4138.3;4390
1971;01;02;4129;4380
1971;01;03;4115.9;4370

이 모든 테이블에 대해 파일 이름의 두 번째 구성 요소를 구현하여 헤더를 변경하고 싶습니다. 따라서 여기에 첨부된 두 가지 "실제" 예제의 경우 원하는 출력은 다음과 같아야 합니다.

예 1: - 파일 이름: almourol_gfdl_85.csv - 원하는 출력:

YEAR;MONTH;DAY;GFDL_WFDisi;GFDL_SWIM;GFDL_GAP3;GFDL_HYPE;GFDL_VIC
1971;01;01;1206.1;627;1252.6;909;357.6
1971;01;02;1303.4;654.3;1397.4;916;478.5
1971;01;03;1248.9;662;1318.8;951;653.1

예 2: - 파일 이름: almourol_had_85.csv - 원하는 출력:

YEAR;MONTH;DAY;HAD_ECOMAG;HAD_HYPE
1971;01;01;4138.3;4390
1971;01;02;4129;4380
1971;01;03;4115.9;4370

답변1

그래서 당신은 원합니다:

  • 파일 이름을 밑줄로 구분된 필드로 분할
  • 네 번째 및 더 큰 헤더 필드(대문자) 앞에 파일 이름의 두 번째 필드를 추가합니다.

존재하다 awk:

awk '
  BEGIN{FS=";"; OFS=FS} 
  FNR==1 {
    split(FILENAME,a,"_"); 
    for (i=4; i<=NF; i++) $i = sprintf("%s_%s", toupper(a[2]), $i)}1
' *85.csv

예를 들어

$ awk 'BEGIN{FS=";"; OFS=FS} FNR==1 {split(FILENAME,a,"_"); for (i=4; i<=NF; i++) $i = sprintf("%s_%s", toupper(a[2]), $i)}1' *85.csv
YEAR;MONTH;DAY;GFDL_WFDisi;GFDL_SWIM;GFDL_GAP3;GFDL_HYPE;GFDL_VIC
1971;01;01;1206.1;627;1252.6;909;357.6
1971;01;02;1303.4;654.3;1397.4;916;478.5
1971;01;03;1248.9;662;1318.8;951;653.1
YEAR;MONTH;DAY;HAD_ECOMAG;HAD_HYPE
1971;01;01;4138.3;4390
1971;01;02;4129;4380
1971;01;03;4115.9;4370

관련 정보