2013-07-19 4 views
0

2 외부 CSV 파일을 조인하려고하지만 어떤 이유로 코드가 전체 파일이 아닌 첫 번째 행에만 연결됩니다.외부 조인을 시도하는 유닉스 가입

csv1.csv :

enter image description here

csv2.csv : 그들은 몇 가지 일반적인 필드와없는 일부가 같이

enter image description here

. 그래서이 두 파일을 외부에 가입시키고 싶습니다. 존재하지 않는 값에 대해 공백 값을 갖는 것이 좋습니다. 이 코드는 http://www.theunixschool.com/2012/01/join-command.html을 시도했지만 코드가 제대로 작동하지 않는 것 같습니다. 예를 들어

: enter image description here

나는 그것이 첫 번째 행에 합류 이유를 모르겠습니다. 나는 시도했다 : 결합 "-t", "-1 1 csv1.csv csv2.csv 그리고 같은 결과를 얻었다. -a1 또는 -a2는 첫 번째 행을 제외한 전체 csv 파일을 반환합니다. 나는 그들이 왜 타의 추종을 불허하는지 이해하지 못한다. 아무도 도와 줄 수 있습니까?

나는 이것에 대한 몇 시간을 보냈고 나는 많은 진전을 이루지 못하고있는 것처럼 보였다. 사전

에서

덕분에 나는 ","-t에 가입 할 경우 -1 1 -A1 -A2 csv1.csv의 csv2.csv

나는 결합 된 헤더는 csv1에서 csv2 + 존재하지 않는 필드 뒤에 얻을 덧붙였다.

나는 정말로 혼란 스럽다.

+1

이미지가 아닌 질문에 CSV 파일의 내용을 추가하십시오. 그게 당신을 도우려는 사람들에게 더 쉽게 도움이 될 것입니다. –

답변

1

데이터베이스 작업을 활용하려면 데이터베이스를 사용하십시오.

#!/bin/bash 

sqlite3 ./temp.db <<EOF | sort >joined.csv 
CREATE TABLE a (name varchar(50), port1 real, port2 real, avg real); 
CREATE TABLE b (name varchar(50), port1 real, port2 real, avg real); 
.mode csv 
.import csv1.csv a 
.import csv2.csv b 
SELECT a.name,a.port1,a.port2,a.avg,b.port1,b.port2,b.avg 
FROM a LEFT OUTER JOIN b ON a.name = b.name 
UNION 
SELECT b.name,a.port1,a.port2,a.avg,b.port1,b.port2,b.avg 
FROM b LEFT OUTER JOIN a ON b.name = a.name; 
EOF 

rm ./temp.db 
+0

전에 sqlite3을 한번도 사용하지 않았습니다. 이 새로 생성 된 테이블에 어떻게 액세스 할 수 있는지 자세히 설명해주십시오. SQL 명령을 보면 이것은 내가 원하는 것을 정확하게 보여줍니다. – yatici

+0

aha 나는 csv를 본다. 어떤 이유로 주문이 변경됩니다. 나는 알파벳순으로 생각한다. 그렇지 않은 것 같아. – yatici

+0

아무 것도 액세스 할 필요가 없습니다. 이 스크립트는 2 개의 테이블을 가진 임시 데이터베이스를 생성하고 2 개의 CSV 파일을 테이블로 읽어 테이블을 조인하고 그 결과를'joined.csv'에 씁니다. 임시 데이터베이스는 그 후에 삭제됩니다. 순서에 관해서는 : SQLite는 FULL OUTER JOIN을 지원하지 않았고 두 개의 LEFT OUTER JOIN의 UNION이 헤더 행을 마지막으로 인쇄했기 때문에 출력을 정렬해야했습니다. –

관련 문제