2013-11-09 5 views
0

조인을 사용하여 원하는 결과를 생성 할 수 없습니다.GNUwin32 join 명령을 개선하는 방법은 무엇입니까?

Windows 7에서 GNUwin32를 실행 중입니다. 64 비트. 조인 버전 5.3.0.1936 및 gawk 버전 3.1.6.2962를 실행 중입니다. 박쥐 파일에 다음 명령을 사용하여

UID_C CID 
C000002 31799 
C000002 31800 
C000386 14950 
C000386 9807916 
C000386 10255083 
C008114 5318432 
C008117 799 
C008117 444150 
C008117 46878464 

Table_2

UID_C CID name 
C000002 31799 bevonium 
C000002 31800 bevonium 
C002284 24832095 hypromellose 
C008117 799 indoleglycerol phosphate 
C008117 444150 indoleglycerol phosphate 
C008117 46878464 indoleglycerol phosphate 

오전

된 table_1 :

다음 두 표는 입력

C:\gnuwin32\bin\join -t"|" -1 1 -2 1 -a1 -a2 -e "NULL" -o "0,1.2,2.2,2.3" C:\directory\Table_1.txt C:\directory\Table_2.txt > C:\directory\Table_3.txt 

에서 내 삽화 stackoverflow에서 테이블을 쉽게 읽을 수있는 탭을 사용하여 서식이 있지만 실제로 입력 및 출력 구분 기호로 파이프를 사용합니다.

다음 표는 출력 :

Table_3

UID_C CID CID name 
C000002 31800 31799 bevonium 
C000002 31800 31800 bevonium 
C000002 31799 31799 bevonium 
C000002 31799 31800 bevonium 
C000386 10255083 NULL NULL 
C000386 9807916 NULL NULL 
C000386 14950 NULL NULL 
C002284 NULL 24832095 hypromellose 
C008114 5318432 NULL NULL 
C008117 46878464 799 indoleglycerol phosphate 
C008117 46878464 444150 indoleglycerol phosphate 
C008117 46878464 46878464 indoleglycerol phosphate 
C008117 444150 799 indoleglycerol phosphate 
C008117 444150 444150 indoleglycerol phosphate 
C008117 444150 46878464 indoleglycerol phosphate 
C008117 799 799 indoleglycerol phosphate 
C008117 799 444150 indoleglycerol phosphate 
C008117 799 46878464 indoleglycerol phosphate 

원하는 출력은 다음과 같습니다

Table_4

UID_C CID name 
C000002 31799 bevonium 
C000002 31800 bevonium 
C000386 14950 NULL 
C000386 9807916 NULL 
C000386 10255083 NULL 
C002284 24832095 hypromellose 
C008114 5318432 NULL 
C008117 799 indoleglycerol phosphate 
C008117 444150 indoleglycerol phosphate 
C008117 46878464 indoleglycerol phosphate 

내가 원하는을 생산하기 위해 결합 명령을 변경하려면 어떻게 산출?

또는 Table_4를 만들기 위해 awk를 Table_3의 포스트 프로세스로 사용해야합니까?

미리 조언 해 주셔서 감사합니다.

답변

2

나는 providex 가입보다 더 많은 로직을 필요가 있다고 생각 :

awk -F"|" -v "OFS=|" ' 
    NR==FNR {uid_cid[$1 OFS $2]=1; next} 
    { 
     key = $1 OFS $2 
     if (key in uid_cid) { 
      delete uid_cid[key] 
     } 
     print 
    } 
    END { 
     for (key in uid_cid) { 
      print key, "NULL" 
     } 
    } 
' Table_1 Table_2 | sort -k1,1 -k2,2n -t "|" 
C000002|31799|bevonium 
C000002|31800|bevonium 
C000386|14950|NULL 
C000386|9807916|NULL 
C000386|10255083|NULL 
C002284|24832095|hypromellose 
C008114|5318432|NULL 
C008117|799|indoleglycerol phosphate 
C008117|444150|indoleglycerol phosphate 
C008117|46878464|indoleglycerol phosphate 
+0

당신의 조언을 약간의 도움이 필요합니다. Column_1은 UID입니다 (간단히하기 위해 밑줄을 그 으십시오). Column_2는 CID입니다. Column_3은 이름입니다. awk 구문으로 번역 할 수 있도록 도와주세요 : {uid_cid [$ 1 OFS $ 2] = 1; 다음} _and_ uid_cid의 키. 아직 연결을하고 있지 않습니다. –

+0

또한 Windows에서 실행하는 데 어려움이 있습니다. table_1 및 table_2의 입력을 사용하여 awk 코드를 실행하고 있습니다. 새로운 테이블 _3으로 리다이렉트하여 awk 처리를 이해하는지 확인하십시오. "errcount : 1"을 얻고 있습니다. –

+0

작은 따옴표가 아닌 큰 따옴표 (Windows의 경우 .bat)를 사용하여 awk 처리를 구분합니다. –