独自の列を含むファイルがあり、この列を特定の文字列(chr)に基づいて複数の列に分割したいと思います。最初の文字列と2番目の文字列、2番目の文字列と3番目の文字列、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
1桁のサフィックスで始まります。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)