正規表現で Uniq -c を使用するか、削除された行数を計算する

正規表現で Uniq -c を使用するか、削除された行数を計算する

遺伝物質に関する情報を含むタブ区切りのファイルがあります。一部の情報は小さなタブファイルに切り捨てられ、一部の列は抽出され、重複がないことを確認するためにuniqが使用されました。後でパイプラインで重要になる数を保存します。 uniq関数の基本を単にあるフィールドのシーケンスベースから別のフィールドの正規表現に変更したいと思います。抽出するフィールドの形式は次のとおりです。

14:50065421-50065521:12397472_t14_w100_x1

ただし、2番目のコロンの後のビットはファイル入力に応じて変化します。前半に基づいてuniqを使いたいです。

14:50065421-50065521

正規表現 '((^[0-9]{0,2}|x|y|MT):[0-9]{0,9}-[0-9]{0,9}: ) をテストしました。 'そしてそれは小さなデータサンプルで動作します。 grepとperlスクリプトを使っていくつかの方法を見つけました。どちらも正規表現に基づいて行を削除できますが、それらのどれもカウントを提供しません(これはuniqが理想的な理由です)。 uniqで正規表現を使用する方法はありますか?それとも削除回数を保存するより良い方法はありますか?

現在のコードは次のとおりです。

cat ${TAB_FILE} | \
    sed -e '1,2d' | \
    cut -f3,4 | \
    sort -k1 -u | \
    sort -k2 | \
    uniq -cf1| \
    sort -rn > t1

cat ${TAB_FILE} | \
    sed -e '1,2d' | \
    awk {'print $3"\t "$6"\t" $7"\t "$4'} | \
    sort -k4 > t2

awk 'FNR==NR {C[$2]=$1;next}FNR==1 \
    {print "Count Chromosome:Positions:QNAME Sequence Exon Transcript_ID"; next}$1 in C \
    {print C[$1], $1, $4, $3, $2}' t1 t2 > t3

cat t3 | awk '{print "//NODECLASS\t\"" $2"_"$1  "\"\t\"Exon " $4 "\"\t\"" $5 "\""}'

最初のステップから2列を使用する代わりに、クリッピングの1列に基づいて正規表現を作成したいと思います。どんな助けでも大変感謝します。明確にする必要がある場合は、いつでもお問い合わせください。

タブファイルの例:

queryHits   subjectHits readname    readSeq geneid  transcriptid    exonnumber  genename    biotype
350851  1   14:50065421-50065521:12397472_t14_w100_x1   CGCTGCCAGCTGCGCGCTCGGGGGAAAAGACGTTGCGCCCCCGCCGACTGCCGGTTTCCCGGGCGCGAGCCCGGATCCAGGTGGTCAGTCCCGGTACGCA    ENSG00000165501 ENST00000298288 1   LRR1    protein_coding
350851  5   14:50065421-50065521:12397472_t14_w100_x1   CGCTGCCAGCTGCGCGCTCGGGGGAAAAGACGTTGCGCCCCCGCCGACTGCCGGTTTCCCGGGCGCGAGCCCGGATCCAGGTGGTCAGTCCCGGTACGCA    ENSG00000165501 ENST00000318317 1   LRR1    protein_coding
350851  8   14:50065421-50065521:12397472_t14_w100_x1   CGCTGCCAGCTGCGCGCTCGGGGGAAAAGACGTTGCGCCCCCGCCGACTGCCGGTTTCCCGGGCGCGAGCCCGGATCCAGGTGGTCAGTCCCGGTACGCA    ENSG00000165501 ENST00000554869 1   LRR1    protein_coding
350852  1   14:50065461-50065561:12655987_t14_w100_x1   CCGCCGACTGCCGGTTTCCCGGGCGCGAGCCCGGATCCAGGTGGTCAGTCCCGGTACGCAACCACGGCGAGAACCCGGCCCTGCTAAGGGAGAAGGGAAG    ENSG00000165501 ENST00000298288 1   LRR1    protein_coding
350852  5   14:50065461-50065561:12655987_t14_w100_x1   CCGCCGACTGCCGGTTTCCCGGGCGCGAGCCCGGATCCAGGTGGTCAGTCCCGGTACGCAACCACGGCGAGAACCCGGCCCTGCTAAGGGAGAAGGGAAG    ENSG00000165501 ENST00000318317 1   LRR1    protein_coding
350852  8   14:50065461-50065561:12655987_t14_w100_x1   CCGCCGACTGCCGGTTTCCCGGGCGCGAGCCCGGATCCAGGTGGTCAGTCCCGGTACGCAACCACGGCGAGAACCCGGCCCTGCTAAGGGAGAAGGGAAG    ENSG00000165501 ENST00000554869 1   LRR1    protein_coding
350853  1   14:50065471-50065571:22679947_t13_w100_x1   CCGGTTTCCCGGGCGCGAGCCCGGATCCAGGTGGTCAGTCCCGGTACGCAACCACGGCGAGAACCCGGCCCTGCTAAGGGAGAAGGGAAGCCGTTTCCCG    ENSG00000165501 ENST00000298288 1   LRR1    protein_coding
350853  5   14:50065471-50065571:22679947_t13_w100_x1   CCGGTTTCCCGGGCGCGAGCCCGGATCCAGGTGGTCAGTCCCGGTACGCAACCACGGCGAGAACCCGGCCCTGCTAAGGGAGAAGGGAAGCCGTTTCCCG    ENSG00000165501 ENST00000318317 1   LRR1    protein_coding
350853  8   14:50065471-50065571:22679947_t13_w100_x1   CCGGTTTCCCGGGCGCGAGCCCGGATCCAGGTGGTCAGTCCCGGTACGCAACCACGGCGAGAACCCGGCCCTGCTAAGGGAGAAGGGAAGCCGTTTCCCG    ENSG00000165501 ENST00000554869 1   LRR1    protein_coding

uniqのない出力ファイルの例、4行、5行、6行、8行、9行、10行などの重複エントリを削除できるようにしたい。

//NODECLASS "Chromosome:Positions:QNAME_Count"  "Exon Exon" "Transcript_ID"

//NODECLASS "14:50067283-50067383:20149917_t14_w100_x1_1"   "Exon 1"    "ENST00000557531"
//NODECLASS "14:50067284-50067366:14257122_t14_w100_x1_2"   "Exon 1"    "ENST00000557531"
//NODECLASS "14:50067285-50067385:2072777_t12_w100_x1_1"    "Exon 1"    "ENST00000557531"
//NODECLASS "14:50074262-50074362:4355312_t12_w100_x1_1"    "Exon 3"    "ENST00000298288"
//NODECLASS "14:50074262-50074362:4355312_t12_w100_x1_1"    "Exon 4"    "ENST00000540712"
//NODECLASS "14:50074262-50074362:4355312_t12_w100_x1_1"    "Exon 4"    "ENST00000554869"
//NODECLASS "14:50067286-50067386:15839225_t12_w100_x1_3"   "Exon 1"    "ENST00000557531"
//NODECLASS "14:50074263-50074363:8914169_t11_w100_x1_1"    "Exon 3"    "ENST00000298288"
//NODECLASS "14:50074263-50074363:8914169_t11_w100_x1_1"    "Exon 4"    "ENST00000540712"
//NODECLASS "14:50074263-50074363:8914169_t11_w100_x1_1"    "Exon 4"    "ENST00000554869"
//NODECLASS "14:50067287-50067387:5439923_t13_w100_x1_1"    "Exon 1"    "ENST00000557531"
//NODECLASS "14:50067287-50067387:14106336_t12_w100_x1_3"   "Exon 1"    "ENST00000557531"
//NODECLASS "14:50074404-50074504:15492363_t11_w100_x1_1"   "Exon 3"    "ENST00000298288"
//NODECLASS "14:50074404-50074504:15492363_t11_w100_x1_1"   "Exon 4"    "ENST00000540712"
//NODECLASS "14:50074404-50074504:15492363_t11_w100_x1_1"   "Exon 4"    "ENST00000554869"
//NODECLASS "14:50074135-50074235:11346262_t11_w100_x1_2"   "Exon 3"    "ENST00000298288"

ベストアンサー1

ソート/ユニークなアイテムに集中しすぎているようなので、正確に何をしたいのかわかりません。

ただし、4,5,6、8,9,10などの重複行をカットする必要がある場合は、// NODECLASS行を持つ最後のファイルでこれを行うことができます。

perl -F\" -lane '
   print,next if $. < 3;
   print if ! $h{($F[1] =~ /:(.*?):/)[0]}++;
' NODE_CLASS_file

最初の2行は印刷からスキップされます。残りは:の間の数字である2番目のフィールドを見て/:(.*?):/数字を提供し、それを含め(...)[0]てハッシュのキーに渡してスカラーコンテキストに入る必要があります%h。現在の行は、このキーがまだ表示されていない場合にのみ印刷されます。

おすすめ記事