各文字列間の不規則な項目数に基づいて、特定の文字列に基づいて1つの列を複数の列に分割します。

各文字列間の不規則な項目数に基づいて、特定の文字列に基づいて1つの列を複数の列に分割します。

独自の列を含むファイルがあり、この列を特定の文字列(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出力ファイル名はfile1桁のサフィックスで始まります。
    • 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)

関連情報