2014-09-16 3 views
6

두 개의 CSV 파일이 있습니다. 키 값인 도시 열을 사용하여 두 개의 CSV 파일을 결합하고 싶습니다.키 값으로 두 개의 CSV 파일을 결합하십시오.

한 csv 파일은 d01.csv는

City, Data, TMax, TMin 
Barcelona, 20140916, 19.9, 28.5 
Tarragona, 20140916, 21.4, 30.5 
Lleida, 20140916, 17.5, 32.5 
Tortosa, 20140916, 20.5, 30.4 

내가 함께, 새로운 CSV 파일이 필요,이 양식,

Barcelona, 19.5, 29.5 
Tarragona, 20.4, 31.5 
Girona, 17.2, 32.5 
Lleida, 16.5, 33.5 
Vic, 17.5, 31.4 

다른 하나, d02.csv을 가지고 다음 구조를 가지고 2 개의 csv 파일에 나타나는 도시 열.

City, Tmin, Tmax, Date, Tmin1, Tmax1 
Barcelona, 19.5, 29.5, 20140916, 19.9, 28.5 
Tarragona, 20.4, 31.5, 20140916, 21.4, 30.5 
Girona, 17.2, 32.5, 20140916, 17.5, 32.5 
Lleida, 16.5, 33.5, 20140916, 20.5, 30.4 

나는하려고 노력하는

join -j 2 -t ',' d01.csv d02.csv | awk -F "," '{print $1, $2, $3, $4, $5} > d03.csv 

로하지만 키 값을 주문할 수있는 방법이 ... 완료되지 않는 이유는 무엇입니까?

+0

있는 그 선두 번호 파일? 해당 조인 명령의 출력은 무엇입니까? 이 프로세스의 일부로'Tmin'과'Tmax' 컬럼 순서를 반전 시키려고하십니까? 'd01.csv'에는 정말로 제목 행이 없습니까? 'Tmax' 값은 입력 파일의 'Tmin' 값보다 작습니까? –

+1

@Jotne 첫 번째 파일의 쉼표가 실수라는 것을 확신하지 못했기 때문에 나는 편집하지 않았습니다. OP는 결국'join' 명령에서'-j 2 '를 사용했습니다. –

+0

OP 편집이 잘못 되었다면 수정하십시오. – Jotne

답변

6

여기에 떠들썩한 파티에 동참 사용하는 방법은 다음과 같습니다 키가 두 파일에 존재하는 가입

{ 
    echo "City, Tmin, Tmax, Date, Tmin1, Tmax1" 
    join -t, <(sort d01.csv) <(sed 1d d02.csv | sort) 
} > d03.csv 
cat d03.csv 
City, Tmin, Tmax, Date, Tmin1, Tmax1 
Barcelona, 19.5, 29.5, 20140916, 19.9, 28.5 
Lleida, 16.5, 33.5 , 20140916, 17.5, 32.5 
Tarragona, 20.4, 31.5 , 20140916, 21.4, 30.5 

참고 레코드 만 출력합니다. 그들 모두를 얻으려면 원하는 필드를 지정, 당신은 두 파일에서 누락 된 기록을 지정할 및 누락 된 필드의 기본 값을 제공 : 실제의

join -t, -a1 -a2 -o 0,1.2,1.3,2.2,2.3,2.4 -e '?' <(sort d01.csv) <(sed 1d d02.csv | sort) 
Barcelona, 19.5, 29.5, 20140916, 19.9, 28.5 
Girona, 17.2, 32.5,?,?,? 
Lleida, 16.5, 33.5 , 20140916, 17.5, 32.5 
Tarragona, 20.4, 31.5 , 20140916, 21.4, 30.5 
Tortosa,?,?, 20140916, 20.5, 30.4 
Vic, 17.5, 31.4,?,?,? 
+0

감사와 명령에 대한 감사합니다. –

+0

대본, 감사합니다! 내 경우에는 (^ M으로 vi에 표시되는) 일부 길잃은 캐리지 리턴을 추가하십시오. 그러나 이는 내 소스 데이터와 관련 될 수 있습니다. 다음의 빠른 vi 명령은 ': % s/\ r // g'을 정렬합니다. – Tom

+0

해당 명령 캐리지 리턴을 추가하지 않았을 것입니다. 그들은 입력 파일에서 왔을 것입니다. –

0

awk가 할 수

awk 'FNR==NR {a[$1]=$2FS$3FS$4;next} $1 in a {print $0,a[$1]}' OFS=", " d02,csv d01csv 
Barcelona, 19.5, 29.5, 20140916, 19.9, 28.5 
Tarragona, 20.4, 31.5 , 20140916, 21.4, 30.5 
Lleida, 16.5, 33.5 , 20140916, 17.5, 32.5 
+0

도 실행되지만이 구조를 설명 할 수 있습니까? –

+0

@EnricAgudPique'FNR == NR' 첫 번째 파일'd02.csv' (파일에서 배열'a'에 인덱스로 첫 번째 필드를 사용하여 데이터 저장)를 실행하고, 다음 파일에서 첫 번째 필드가 발견되면 '$ 1 in a' print 출력이 필요합니다. 이것은 awk에서 두 개의 파일을 처리하는 일반적인 방법입니다. – Jotne

+0

도움을 주셔서 감사합니다. –

관련 문제