다음과 같은 이름의 파일이 여러 개 있습니다(예로 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