2012-07-09 2 views
0

이 문제의 해결책을 찾고 있는데요 : 다음 인용문에서 보여주는 것과 같은 파일 (탭으로 구분)이 있습니다. 에서 볼 수 있듯이 첫 번째 부분 (굵게 표시된 부분)과 일치하는 줄이 있습니다.줄의 요소를 결합하십시오.

CHR4 164,440,449 165,354,407 G1 P8002-51-75
chr1 220,871,675 220,962,596 G2 P2368-132-84
chr1 220,871,675 220,962,596 G2 P2369-152-116
chr1 220,871,675 220,962,596 G2 P2371 -180-82
chr1 220,871,675 220,962,596 G2 P2372-223-129
chr1 220,871,675 220,962,596 G2 P2 373-153-96
chr1 220,871,675 220,962,596 G2 P2370-104-78
chr5 126,198,405 126,416,440 G3 P9333-135-146
chr5 126,198,405 126,416,440 G3 P9334-151-116

AWK 또는 PERL 사용하기 어떻게하면 탭으로 구분 된 형식을 유지하면서 다음 출력을 얻을 수 있습니까 ??? 일반적인 개념은 마지막 필드

CHR4 164,440,449 165,354,407 G1 P8002-51-75
chr1 220,871,675 220,962,596 G2 P2368-132-84 P2369-에게 처음 부분에 따라 라인을 통합하려고하고 추가하는 것입니다 152-116 P2371-180-82 P2372-223-129 P2373-153-96 P2370-104-78
chr5 126,198,405 126,416,440 G3 P9333-135-146 P9334-151-116

일반 개념은 처음 부분에 따라 행을 통합하려고 시도하는 것입니다. 차 마지막 필드를 perl 사용

+0

참조 : HTTP : // 유래 .com/questions/11389990/group-rows-in-text-file-and-aggregate-corresponding-rows-to-column/11390214 # 11390214 – kev

+0

데이터가 이미 표시된 것처럼 그룹화되었거나 일부 행이 ord 그렇지? –

답변

1

한 가지 방법 추가 :

perl -ane ' 
    ## Save all fields but the last one as the key to compare between rows. 
    $key = join qq|\t|, @F[ 0 .. $#F - 1 ]; 

    ## In first line or when current key is equal to previous key, save last 
    ## field in an array and stop processing current row. 
    if ($. == 1 || $key eq $pkey) { 
     $pkey = $key; 
     push @value, $F[ $#F ]; 
     next unless eof; 
    } 

    ## At this point, keys between rows are different, so print previous 
    ## key with its values and begin to save the new one. 
    printf qq|%s\n|, join qq|\t|, $pkey, @value; 
    @value =(); 
    push @value, $F[ $#F ]; 

    ## Exception: Last line with a new key, print it. 
    if (eof && $pkey ne $key) { 
    printf qq|%s\n|, join qq|\t|, $key, @value; 
    } 

    ## Save previous key. 
    $pkey = $key; 

' infile 

이 질문의 데이터 infile 가정을, 출력은 다음과 같습니다

chr4 164440449  165354407  G1  P8002-51-75 
chr1 220871675  220962596  G2  P2368-132-84 P2369-152-116 P2371-180-82 P2372-223-129 P2373-153-96 P2370-104-78 
chr5 126198405  126416440  G3  P9333-135-146 P9334-151-116 
+0

WOOOOW !!!! @ Birei 덕분에 그것은 soooo 도움이되었다 :) – FoRsUs

2
while (<DATA>) { 
    ($x, $y) = /^(.*)\s([-\w]+)$/; 
    push @{$hash{$x}}, $y; 
} 
while (($k, $v) = each %hash) { 
    print $k, join("\t", @{$v}), "\n"; 
} 
__DATA__ 
chr4 164440449 165354407 G1 P8002-51-75 
chr1 220871675 220962596 G2 P2368-132-84 
chr1 220871675 220962596 G2 P2369-152-116 
chr1 220871675 220962596 G2 P2371-180-82 
chr1 220871675 220962596 G2 P2372-223-129 
chr1 220871675 220962596 G2 P2373-153-96 
chr1 220871675 220962596 G2 P2370-104-78 
chr5 126198405 126416440 G3 P9333-135-146 
chr5 126198405 126416440 G3 P9334-151-116 
관련 문제