我有一个制表符分隔的文件,其中包含有关遗传物质的信息。一些信息被切割成一个较小的选项卡文件,并提取一些列,并使用 uniq 来确保没有重复。存储一个计数,这对于以后的管道很重要。我想将 uniq 函数的基础从简单地基于一个字段中的序列更改为来自另一个字段中的正则表达式。我要从中提取的字段采用以下格式:
14:50065421-50065521:12397472_t14_w100_x1
但第二个冒号后面的位会根据文件输入而变化。我想在前半部分的基础上使用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 "\""}'
从第一步开始,我想将正则表达式基于剪切的第 1 列,而不是使用第 2 列。任何帮助将不胜感激,请随时询问您是否需要我澄清任何内容。
选项卡文件示例:
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
其中前两行被跳过打印。对于其余部分,我们查看第二个字段,即 : 之间的数字,/:(.*?):/
将为您提供数字,然后您需要通过将其包含在内来进入标量上下文(...)[0]
并将其作为散列的键传递%h
。仅当尚未看到此键时才打印当前行。
答案2
我设法找到了一个粗略的解决方案,将开始结束位置作为单独的列添加到选项卡文件中。然后,在创建 Nodeclass 文件时,我也提取此列,并使用 sort | uniq -c 基于此而不是序列列。它似乎正在做我想要的事情,但速度稍慢,因为创建选项卡文件的脚本需要生成一整列额外的列!谢谢 :)