정규 표현식과 함께 Uniq -c를 사용하거나 삭제된 행 수 계산

정규 표현식과 함께 Uniq -c를 사용하거나 삭제된 행 수 계산

유전 물질에 대한 정보가 포함된 탭으로 구분된 파일이 있습니다. 일부 정보는 더 작은 탭 파일로 잘렸고 일부 열은 추출되었으며 중복이 없는지 확인하는 데 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 "\""}'

첫 번째 단계부터 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

처음 두 줄은 인쇄에서 건너뜁니다. 나머지는 : 사이의 숫자인 두 번째 필드를 살펴보고 /:(.*?):/숫자를 제공한 다음 이를 포함 (...)[0]하고 해시의 키로 전달하여 스칼라 컨텍스트로 들어가야 합니다 %h. 현재 행은 이 키가 아직 표시되지 않은 경우에만 인쇄됩니다.

답변2

탭 파일에 시작 위치와 끝 위치를 별도의 열로 추가하여 대략적인 해결책을 찾았습니다. 그런 다음 Nodeclass 파일을 생성할 때 이 열을 추출하고 시퀀스 열 대신 이를 기반으로 sort | uniq -c를 사용합니다. 내가 원하는 대로 작동하는 것 같지만 탭 파일을 생성하는 스크립트가 전체 추가 열을 생성해야 하기 때문에 조금 느립니다! 감사해요:)

관련 정보