Unixコマンドを使用した複雑なテキストファイルの解析

Unixコマンドを使用した複雑なテキストファイルの解析

次のテキスト構造を解析したいと思います。

>Cluster 423
0   56aa, >HWI-ST1448:257:C3V2HACXX:1:1106:19087:2550.1... at 92.86%
1   64aa, >HWI-ST1448:257:C3V2HACXX:1:1106:15943:81371.1... *
2   41aa, >HWI-ST1448:257:C3V2HACXX:1:1106:12438:91360.3... at 90.24%
3   45aa, >HWI-ST1448:257:C3V2HACXX:1:1108:13046:13861.1... at 91.11%
4   52aa, >HWI-ST1448:257:C3V2HACXX:1:1110:12260:2424.2... at 90.38%
>Cluster 434
0   64aa, >HWI-ST1448:257:C3V2HACXX:1:1106:15723:89894.1... *
1   46aa, >HWI-ST1448:257:C3V2HACXX:2:1312:1967:40935.2... at 97.83%

デフォルトでは、識別子は*最後にaで表され、グループサイズは最後のグループ番号+ 1になります。

私が生成したい結果は次のとおりです(最後のグループサイズを参照)。

HWI-ST1448:257:C3V2HACXX:1:1106:15943:81371.1      5
HWI-ST1448:257:C3V2HACXX:1:1106:15723:89894.1      2

どんなアイデアがありますか?

答え1

以下はやや粗雑なものです(エラー処理なし)。

awk '/\*$/   { save_id = substr($3, 2, length($3)-4) }
    /^[0-9]/ { save_num = $1 }
    NR > 1 && /^>/ {print save_id, save_num+1 }
    END  {print save_id, save_num+1 }
    ' data_file
  • *(つまり、マッチ)で終わる行は、最初の文字()と最後の3文字()を/*$/捨て、3番目の単語からグループIDを抽出します。>...
  • 数字で始まる行には、その数字(つまり最初の単語)が格納されます。
  • ファイルの終わりで始まるか> (ただし、を指定してファイルの最初の行を除く)行が発生した場合は、対応する保存値を出力します。NR > 1

答え2

perl  -F'\n' -lan00e 'print "$1\t$#F" if />(.*)\.{3} \*$/m'

答え3

sed '/^[>0-9]/h;s/.*>\(.*[0-9]\).*\*/[\1 ]P /p
     $s/.*//;/^[>0-9[]/d;g;s/ .*/ 1+pc/ 
' <<\DATA | dc
>Cluster 423
0   56aa, >HWI-ST1448:257:C3V2HACXX:1:1106:19087:2550.1... at 92.86%
1   64aa, >HWI-ST1448:257:C3V2HACXX:1:1106:15943:81371.1... *
2   41aa, >HWI-ST1448:257:C3V2HACXX:1:1106:12438:91360.3... at 90.24%
3   45aa, >HWI-ST1448:257:C3V2HACXX:1:1108:13046:13861.1... at 91.11%
4   52aa, >HWI-ST1448:257:C3V2HACXX:1:1110:12260:2424.2... at 90.38%

>Cluster 434
0   64aa, >HWI-ST1448:257:C3V2HACXX:1:1106:15723:89894.1... *
1   46aa, >HWI-ST1448:257:C3V2HACXX:2:1312:1967:40935.2... at 97.83%
DATA

出力

HWI-ST1448:257:C3V2HACXX:1:1106:15943:81371.1 5
HWI-ST1448:257:C3V2HACXX:1:1106:15723:89894.1 2

これはとても簡単です。文字を含むすべての行の最初の数字のコピーを保持します。*行の最後の文字を正常に削除できるか、行で始まらない場合にのみ印刷されます>0-9。最後の行のすべての文字が削除されます。したがって、空白行に格納されている数値を抽出すると、文字列と各文字列の小さな追加操作がdc得られます。[ stuff here ]pClustersed

答え4

 grep "\*" file.txt |grep -E "(?<=>)[\w+\s\W]+"|sed 's/\.\.\.\*//'

関連情報