고유한 열이 포함된 파일이 있고 이 열을 특정 문자열(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)의 솔루션이 더 복잡합니다. 이를 위해서는 어떻게 해야 하는지에 대한 더 명확한 질문이 필요합니다.저것.