특정 문자열을 기준으로 열을 여러 열로 분할

특정 문자열을 기준으로 열을 여러 열로 분할

고유한 열이 포함된 파일이 있고 이 열을 특정 문자열(chr)을 기반으로 여러 열로 분할하고 싶습니다.

입력은 다음과 같습니다.

chr10:127293562-127293909
BRUNOL4(Hs/Mm)
CPEB4(Hs/Mm)
CUG-BP(Hs/Mm)
DAZAP1(Hs/Mm)
ENOX1(Hs/Mm)
FMR1(Hs/Mm)
chr11:49214073-49214804
BRUNOL4(Hs/Mm)
BRUNOL5(Hs/Mm)
CPEB2(Hs/Mm)
CPEB4(Hs/Mm)
CUG-BP(Hs/Mm)
HNRNPC(Hs/Mm)

출력은 다음과 같아야 합니다.

chr10:127293562-127293909  chr11:49214073-49214804
BRUNOL4(Hs/Mm)             BRUNOL4(Hs/Mm)
CPEB4(Hs/Mm)               BRUNOL5(Hs/Mm)    
CUG-BP(Hs/Mm)              CPEB2(Hs/Mm)
DAZAP1(Hs/Mm)              CPEB4(Hs/Mm)    
ENOX1(Hs/Mm)               CUG-BP(Hs/Mm)
FMR1(Hs/Mm)                HNRNPC(Hs/Mm)

어떤 아이디어라도 크게 감사하겠습니다.

답변1

awk '/^chr/{i++} 
           {print > "_aux" i }
       END {system( "paste _aux* | column -tn; rm _aux*")}' file
  • 처음 2줄( print > "_aux" i)은 입력을 파일 세트로 분할합니다 _aux1... _auxn(각 파일 = 하나의 열)
  • 마지막으로 paste _aux* | column -tn다양한 섹션을 붙여넣고 서식을 지정합니다.

이 솔루션은 여러 열을 처리할 수 있기를 바랍니다.

답변2

이것은 전형적인 awk 문제입니다:

#!/usr/bin/awk -f
BEGIN{ col = -1; l = 0; r = 0; width = 0; }
/^chr[0-9]+:/ {
        ++col;
}
{
        if ( col == 0 ) {
                L[l++] = $0;
        } else {
                R[r++] = $0;
        }
        if ( length ($0) > width ) {
                width = length ($0) ;
        }
}
END {
        for ( i = 0; i < l; ++i ) {
                printf "%-*s %s\n", width, L[i], R[i];
        }
}

스크립트 이름을 "foo"로 지정하고 실행 가능하게 만든 다음 데이터를 파이프로 연결합니다.

./foo < foo.in

주다

chr10:127293562-127293909 chr11:49214073-49214804
BRUNOL4(Hs/Mm)            BRUNOL4(Hs/Mm)
CPEB4(Hs/Mm)              BRUNOL5(Hs/Mm)
CUG-BP(Hs/Mm)             CPEB2(Hs/Mm)
DAZAP1(Hs/Mm)             CPEB4(Hs/Mm)
ENOX1(Hs/Mm)              CUG-BP(Hs/Mm)
FMR1(Hs/Mm)               HNRNPC(Hs/Mm)

왼쪽/오른쪽 열에 동일한 수의 항목이 있고 두 개의 열만 있다고 가정합니다. awk에는 1차원 배열만 있습니다. 문제에 더 많은 열(예: 임의의 숫자)이 필요한 경우 awk(또는 바람직하게는 Perl)의 솔루션이 더 복잡합니다. 이를 위해서는 어떻게 해야 하는지에 대한 더 명확한 질문이 필요합니다.저것.

관련 정보