2012-01-12 4 views
3

두 개의 파일을 bash에 공통 열을 사용하여 가입하고 싶습니다. 나는 두 파일 모두에서 모든 유랑과 비길 수없는 줄을 유지하고 싶다. 불행히도 join을 사용하여 하나의 파일에서만 견딜 수없는 필드를 저장할 수 있습니다 (예 : join -1 1 -2 2 -a1 -t" ".
두 파일의 반복 항목 (조인 열)에 대한 모든 쌍을 유지하려고합니다. 즉, 파일 1은
X ID1 AB 경우
X ID1 CD
X ID1 안양
X ID2 CX
X ID3 FV
은 SAS와 같이 bash로 결합합니다

과 두 번째 파일


ID1 ds는 DG
ID1 안양 CF입니다 id2 cv df
id2를 ds로 사용
id3 cf cg

결과 파일은 다음과 같아야합니다

X ID1 순이 안양 CF
X ID1 AB DS DG
X ID1 CD 안양 CF
X ID1 CD ds는 DG
X ID1 DF DF CF
X ID1 안양 DS DG
X ID2 CX 이력서 안양
X ID2 CX로 DS
X ID3 FV CF CG

난 항상 적절한 열을 정렬 한 후, 같은 가입 할 SAS를 사용하여 한 이유

. merge file1 file2;
by common_column;
run;

그것은 잘 작동

하지만 나는 SAS의 데이터를 병합 윈도우로 전환해야 할 대부분의 시간 동안 우분투를 사용으로

data x;

.
2. 가장 중요한 것은 SAS는 너무 긴 데이터 항목을자를 수 있다는 것입니다.

그래서 필자는 bash에서 내 파일에 참여하는 것을 선호하지만 적절한 명령을 알지 못합니다.
누군가 나를 도울 수 있습니까, 아니면 적절한 자원으로 안내해 줄 수 있습니까?

+2

SAS의 최대 가변 길이는 32767 문자입니다. 따라서 절단 문제가 발생하고 파일이 그보다 더 넓지 않은 경우 다른 문제가 발생합니다. 파일명이나 infile 문에'lrecl = 32767' 문을 추가해야 할 수도 있습니다. –

+0

가져 오기 마법사를 사용했습니다. "추측 행 수"를 지정할 수있는 필드가 있습니다. 가져 오는 동안 SAS가이 행을 검색하고 발견 된 가장 긴 레코드에 따라 변수 길이를 할당합니다. 코드와 제안을 사용하여 가져 오기를 시도하겠습니다. – boczniak767

답변

4

join의 설명서 페이지에 따르면 -a <filenum>은 파일 <filenum> (1 또는 2)의 모든 지원되지 않는 줄을 유지합니다. 따라서 명령 줄에 -a1 -a2을 추가하기 만하면됩니다. 예 :

# cat a 
1 blah 
2 foo 

# cat b 
2 bar 
3 baz 

# join -1 1 -2 1 -t" " a b 
2 foo bar 

# join -1 1 -2 1 -t" " -a1 a b 
1 blah 
2 foo bar 

# join -1 1 -2 1 -t" " -a2 a b 
2 foo bar 
3 baz 

# join -1 1 -2 1 -t" " -a1 -a2 a b 
1 blah 
2 foo bar 
3 baz 

이 정보가 필요하십니까?

편집 :. 원하는 출력을 생성하는 방법 (내 파일 a 첫 번째 파일 내 파일 b 두 번째 파일 참고 나는 반대했다

당신은 자세한 내용을 제공하기 때문에, 여기 -1 1 -2 2에서 -1 2 -2 1까지 ID에 합류).나뿐만 아니라 출력을 포맷 할 수있는 필드 목록을 추가 - '0'이 그 안에 결합 필드이므로주의 :

# join -1 2 -2 1 -o 1.1,0,1.3,1.4,2.2,2.3 a b 

당신이 준 무엇을 생산하고 있습니다. 어떤 밖으로 왼쪽 필드는 단지 공간이기 때문에 오히려 읽을 수

x id4 u t 
id5 ui oi 

: 당신이 다음 두 줄 이상을 얻을 두 파일에서 unpairable 라인을 유지하기 -A1 -A2 추가 (당신은 그들로부터 내 테스트 데이터를 추측 할 수있다). '-'그래서이로 교체하자로 이어지는 : join 명령이 충분히 강력하지

# join -1 2 -2 1 -a1 -a2 -e- -o 1.1,0,1.3,1.4,2.2,2.3 a b 
x id1 a b df cf 
x id1 a b ds dg 
x id1 c d df cf 
x id1 c d ds dg 
x id1 d f df cf 
x id1 d f ds dg 
x id2 c x cv df 
x id2 c x as ds 
x id3 f v cf cg 
x id4 u t - - 
- id5 - - ui oi 
+0

거의 완벽한 솔루션입니다. 거의 - 왜냐하면 열의 지정이 필요하기 때문입니다. 내 실제 파일에는 각각 15 및 4 개의 열이 있습니다. 그래서 그것의 사양은별로 편리하지 않습니다. 하지만 작품, 그래서 당신의 응답을 받아들입니다 - 고마워. – boczniak767

1

경우 내가 쉘에서 이러한 작업을 수행해야하는 경우 나는 보통 sqlite를 사용합니다.

테이블에 플랫 파일을 쉽게 가져올 수 있으며 SELECT과 적절한 JOIN을 사용하십시오. SQLite는, 당신은 심지어 빠른에 가입 할 인덱스을 활용할 수

참고.

sqlite3 << EOF! 
CREATE TABLE my table1 (.... -- define your table here 
CREATE TABLE my table2 (.... -- define your table here 
.separator "," -- define input field separator here if needed 
.import input_file.txt mytable1 
.import input_file.txt mytable2 
SELECT ... JOIN ... 
EOF! 

sqlite는 무료이며 mutiplatform입니다. 매우 편리합니다.

+0

매 작업마다 새 소프트웨어를 설치하는 것을 좋아하지 않지만 많은 병합 작업을 수행해야 도움이 될지 모릅니다. – boczniak767

+0

@ MaciejJończyk : sqlite는 작고 편리합니다. 어쨌든 가치가 있습니다 :-) –

관련 문제