2016-08-08 4 views
0

두 개의 서로 다른 파일의 여러 열을 일치 시키려하고 새로운 출력은 file1의 모든 열과 파일 2의 일치로 결합됩니다. 그렇지 않은 경우 'null'을 반환합니다. 시합. 파일은 정렬되지 않습니다. 두 파일 모두 거대하고 탭으로 구분됩니다.두 파일의 여러 열을 일치시키고 두 파일을 결합하십시오.

파일 1 :

#CHROM POS  ID    REF  ALT  QUAL   FILTER INFO 

1  69511 rs75062661  A  G  120729371.20 PASS AC=66446;AC_AFR=3767;AC_AMR=5986;AC_Adj=63799;AC_EAS=7618;AC_FIN=3289;AC_Het=1539;AC_Hom=31130;AC_NFE=30553;AC_OTH=437;AC_SAS=12149;AF=0.894;AN=74318;AN_AFR=6394;AN_AMR=6286;AN_Adj=67892;AN_EAS=7622;AN_FIN=3320;AN_NFE=31460;AN_OTH=452;AN_SAS=12358;BaseQRankSum=0.831;ClippingRankSum=1.06;DB;DP=2687838;FS=23.500;GQ_MEAN=224.54;GQ_STDDEV=255.92;Het_AFR=873;Het_AMR=152;Het_EAS=4;Het_FIN=11;Het_NFE=377;Het_OTH=9;Het_SAS=113;Hom_AFR=1447;Hom_AMR=2917;Hom_EAS=3807;Hom_FIN=1639;Hom_NFE=15088;Hom_OTH=214;Hom_SAS=6018;InbreedingCoeff=0.6382;MQ=31.34;MQ0=0;MQRankSum=-4.020e-01;NCC=29303;QD=26.34;ReadPosRankSum=-1.106e+00;VQSLOD=131.28;culprit=FS;DP_HIST=2375|696|240|284|1521|1069|1274|1579|2061|2600|2780|2580|2302|1874|1363|1096|905|839|814|8907,855|552|218|280|521|865|1246|1574|2056|2596|2775|2575|2300|1873|1362|1094|904|839|814|8871;GQ_HIST=945|1293|469|252|189|82|120|127|109|147|156|181|1403|374|268|384|433|374|482|29371,66|523|454|240|147|77|117|126|106|143|156|175|237|309|261|377|432|374|482|29368;CSQ=G|ENSG00000186092|ENST00000335137|Transcript|missense_variant|421|421|141|T/A|Aca/Gca|rs75062661|1||1|OR4F5|HGNC|14825|protein_coding|YES|CCDS30547.1|ENSP00000334393|OR4F5_HUMAN||UPI0000041BC1|tolerated(0.63)|benign(0.003)|1/1||Transmembrane_helices:Tmhmm&Pfam_domain:PF00001&Pfam_domain:PF10320&PROSITE_profiles:PS50262&Superfamily_domains:SSF81321|ENST00000335137.3:c.421A>G|ENSP00000334393.3:p.Thr141Ala|A:0.3480|G:0.33|G:0.65|G:0.87|G:0.70|G:0.544101|G:0.887429||||||||||| 

원하는 출력 :

chromosome position reference alternate +50 other columns 
1    69511   A   G   other columns 
1    69897   G   C   other columns 

파일 2는 데이터베이스 파일 ((8 열)입니다 (난 단지 50 개 이상의 열이 있으며, 여기에 여러 열을 표시)

chromosome position reference alternate +50 other columns from file1  #CHROM POS  ID    REF  ALT  QUAL   FILTER INFO  
1    69511   A   G   other columns      1  69511 rs75062661  A  G  120729371.20 PASS AC=66446;AC_AFR=3767;AC_AMR=5986;AC_Adj=63799;AC_EAS=7618;AC_FIN=3289;AC_Het=1539;AC_Hom=31130;AC_NFE=30553;AC_OTH=437;AC_SAS=12149;AF=0.894;AN=74318;AN_AFR=6394;AN_AMR=6286;AN_Adj=67892;AN_EAS=7622;AN_FIN=3320;AN_NFE=31460;AN_OTH=452;AN_SAS=12358;BaseQRankSum=0.831;ClippingRankSum=1.06;DB;DP=2687838;FS=23.500;GQ_MEAN=224.54;GQ_STDDEV=255.92;Het_AFR=873;Het_AMR=152;Het_EAS=4;Het_FIN=11;Het_NFE=377;Het_OTH=9;Het_SAS=113;Hom_AFR=1447;Hom_AMR=2917;Hom_EAS=3807;Hom_FIN=1639;Hom_NFE=15088;Hom_OTH=214;Hom_SAS=6018;InbreedingCoeff=0.6382;MQ=31.34;MQ0=0;MQRankSum=-4.020e-01;NCC=29303;QD=26.34;ReadPosRankSum=-1.106e+00;VQSLOD=131.28;culprit=FS;DP_HIST=2375|696|240|284|1521|1069|1274|1579|2061|2600|2780|2580|2302|1874|1363|1096|905|839|814|8907,855|552|218|280|521|865|1246|1574|2056|2596|2775|2575|2300|1873|1362|1094|904|839|814|8871;GQ_HIST=945|1293|469|252|189|82|120|127|109|147|156|181|1403|374|268|384|433|374|482|29371,66|523|454|240|147|77|117|126|106|143|156|175|237|309|261|377|432|374|482|29368;CSQ=G|ENSG00000186092|ENST00000335137|Transcript|missense_variant|421|421|141|T/A|Aca/Gca|rs75062661|1||1|OR4F5|HGNC|14825|protein_coding|YES|CCDS30547.1|ENSP00000334393|OR4F5_HUMAN||UPI0000041BC1|tolerated(0.63)|benign(0.003)|1/1||Transmembrane_helices:Tmhmm&Pfam_domain:PF00001&Pfam_domain:PF10320&PROSITE_profiles:PS50262&Superfamily_domains:SSF81321|ENST00000335137.3:c.421A>G|ENSP00000334393.3:p.Thr141Ala|A:0.3480|G:0.33|G:0.65|G:0.87|G:0.70|G:0.544101|G:0.887429||||||||||| 
1    69897   G   C   other columns      null null null   null null  null   null null 

파일은 정렬되지 않음

이 명령은 내가이 forumn에서 join 명령을 찾을 파일 2

awk -F '\t' 'NR==FNR{c[$1$2$3$4]++;next};c[$1$2$4$5]>0' file1 file2 

에서 나에게 일치하는 라인을 줄 것이다하지만 involed 입력 밖으로 모든 열은 파일 1에서 모든 열을 인쇄 할 수 있습니다. 50 개 이상의 열이 있으므로 모든 열을 입력하면 실용적이지 않고 오류가 발생하기 쉽습니다. join를 들어

+0

배열 키 ('c [$ 1 $ 2 $ 3 $ 4]')를 생성하기위한 필드 연결은 거의 항상 나쁜 생각입니다. 'abc d e'와'a bc d e'를 어떻게 구별 할 수 있습니까? 'c [$ 1, $ 2, $ 3, $ 4]'와 같이 쉼표를 사용하여 값을 분리하십시오. –

+0

[Unix의 텍스트 파일에 여러 필드 결합] (http://stackoverflow.com/questions/2619562)을 참조하십시오. –

답변

1
$ cat tst.awk 
BEGIN { FS=OFS="\t" } 
NR==FNR { 
    if (FNR==1) { 
     hdr = $0 
     gsub(/[^\t]+/,"null") 
     nulls = $0 
    } 
    else { 
     map[$1,$2,$4,$5] = $0 
    } 
    next 
} 
{ 
    if (FNR==1) { 
     tail = hdr 
    } 
    else if (($1,$2,$3,$4) in map) { 
     tail = map[$1,$2,$3,$4] 
    } 
    else { 
     tail = nulls 
    } 
    print $0, tail 
} 


$ awk -f tst.awk file2 file1 
chromosome  position  reference  alternate  +50 other columns  #CHROM POS  ID  REF  ALTQUAL  FILTER INFO 
1  69511 A  G  other columns 1  69511 rs75062661  A  G  120729371.20 PASS AC=66446;AC_AFR=3767;AC_AMR=5986;AC_Adj=63799;AC_EAS=7618;AC_FIN=3289;AC_Het=1539;AC_Hom=31130;AC_NFE=30553;AC_OTH=437;AC_SAS=12149;AF=0.894;AN=74318;AN_AFR=6394;AN_AMR=6286;AN_Adj=67892;AN_EAS=7622;AN_FIN=3320;AN_NFE=31460;AN_OTH=452;AN_SAS=12358;BaseQRankSum=0.831;ClippingRankSum=1.06;DB;DP=2687838;FS=23.500;GQ_MEAN=224.54;GQ_STDDEV=255.92;Het_AFR=873;Het_AMR=152;Het_EAS=4;Het_FIN=11;Het_NFE=377;Het_OTH=9;Het_SAS=113;Hom_AFR=1447;Hom_AMR=2917;Hom_EAS=3807;Hom_FIN=1639;Hom_NFE=15088;Hom_OTH=214;Hom_SAS=6018;InbreedingCoeff=0.6382;MQ=31.34;MQ0=0;MQRankSum=-4.020e-01;NCC=29303;QD=26.34;ReadPosRankSum=-1.106e+00;VQSLOD=131.28;culprit=FS;DP_HIST=2375|696|240|284|1521|1069|1274|1579|2061|2600|2780|2580|2302|1874|1363|1096|905|839|814|8907,855|552|218|280|521|865|1246|1574|2056|2596|2775|2575|2300|1873|1362|1094|904|839|814|8871;GQ_HIST=945|1293|469|252|189|82|120|127|109|147|156|181|1403|374|268|384|433|374|482|29371,66|523|454|240|147|77|117|126|106|143|156|175|237|309|261|377|432|374|482|29368;CSQ=G|ENSG00000186092|ENST00000335137|Transcript|missense_variant|421|421|141|T/A|Aca/Gca|rs75062661|1||1|OR4F5|HGNC|14825|protein_coding|YES|CCDS30547.1|ENSP00000334393|OR4F5_HUMAN||UPI0000041BC1|tolerated(0.63)|benign(0.003)|1/1||Transmembrane_helices:Tmhmm&Pfam_domain:PF00001&Pfam_domain:PF10320&PROSITE_profiles:PS50262&Superfamily_domains:SSF81321|ENST00000335137.3:c.421A>G|ENSP00000334393.3:p.Thr141Ala|A:0.3480|G:0.33|G:0.65|G:0.87|G:0.70|G:0.544101|G:0.887429||||||||||| 
1  69897 G  C  other columns null null null null null null null null 
1

몇 가지 코드 유형 것을, 50 열 +를 입력 할 수 있도록 할 필요가 없습니다. join-o 옵션이 파일 # 2에서 60 개의 열을 인쇄해야한다고 가정하십시오. (다소 약칭 함)

seq -s, 2.01 .01 2.60 | sed 's/\.0/./g' 

출력 :

2.1,2.2,2.3,2.4,2.5,2.6,2.7,2.8,2.9,2.10,2.11,2.12, ... 2.58,2.59,2.60 

이 코드를 사용, $()로 묶어야 (또는 변수에 할당

다음은 반복적 인 문자열을 만들 수있는 하나의 방법), 그런 다음 join을 사용하십시오 :

join -a 2 -o $(seq -s, 2.01 .01 2.60 | sed 's/\.0/./g') foo bar 
관련 문제