고유한 열이 포함된 파일이 있고 이 열을 특정 문자열(chr)을 기반으로 여러 열로 분할하고 싶습니다. 첫 번째 문자열과 두 번째 문자열, 두 번째 문자열과 세 번째 문자열, n 번째 문자열과 m 번째 문자열 사이의 항목 수가 불규칙합니다.
입력은 다음과 같습니다.
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)
HNRNPCL1(Hs/Mm)
HNRNPH1(Hs/Mm)
HuR(Hs/Mm)
MBNL1(Hs/Mm)
NOVA1(Hs/Mm)
chr11:49854587-49855127
A1CF(Hs/Mm)
BRUNOL4(Hs/Mm)
출력은 다음과 같아야 합니다.
chr10:127293562-127293909 chr11:49214073-49214804 chr11:498547-498551
BRUNOL4(Hs/Mm) BRUNOL4(Hs/Mm) A1CF(Hs/Mm)
CPEB4(Hs/Mm) BRUNOL5(Hs/Mm) BRUNOL4(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)
HNRNPCL1(Hs/Mm)
HNRNPH1(Hs/Mm)
HuR(Hs/Mm)
MBNL1(Hs/Mm)
NOVA1(Hs/Mm)
답변1
$ csplit -zsf file -n 1 ip.txt /^chr/ {*} ; paste file* | column -nt
chr10:127293562-127293909 chr11:49214073-49214804 chr11:49854587-49855127
BRUNOL4(Hs/Mm) BRUNOL4(Hs/Mm) A1CF(Hs/Mm)
CPEB4(Hs/Mm) BRUNOL5(Hs/Mm) BRUNOL4(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)
HNRNPCL1(Hs/Mm)
HNRNPH1(Hs/Mm)
HuR(Hs/Mm)
MBNL1(Hs/Mm)
NOVA1(Hs/Mm)
csplit
패턴에 따라 파일을 분할하는 데 사용됩니다.-z
빈 파일을 제거하는 옵션(패턴이 첫 번째 줄 자체와 일치하는 경우)-s
로그 출력 억제-f file -n 1
출력 파일 이름은file
한 자리 접미사 로 시작됩니다.ip.txt
입력 파일이며/^chr/
처리할 패턴입니다.{*}
최대한 나눠서
paste
그런 다음 열 연결로 파일을 분할하는 데 사용되었습니다.column -nt
붙여넣기 출력의 스타일을 지정하는 데 사용되며 인접한 구분 기호 병합과 GNU 확장의-n
기본 동작을 방지합니다.column
답변2
그리고진주파이프가 없는 경우:
#!/usr/bin/env perl
use strict; use warnings;
my $c = -1; my $arr = [];
while (<>) {
if (/^chr/) {$c++};
chomp;
push(@{ $arr->[$c] }, $_);
}
foreach my $i (0...scalar(@{ $arr->[1] }) -1) {
printf("%-30s %s\n", $arr->[0]->[$i], $arr->[1]->[$i]);
}
산출
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)