題:
使用讀取ID刪除從fastq文件讀取的fastq的所有4行
T. Ntsowe
2018-10-30 14:01:57 UTC
view on stackexchange narkive permalink

運行bowtie2時出現以下錯誤:

錯誤:讀取了HWI-D00466:116:CC62WANXX:3:1102:7363:63646 1:N:0:GCACACG的更多信息字符而不是質量值。

我現在想從fastq文件中刪除所有此特定讀取的4行。

如何使用awk或sed執行此操作?

在您的FASTQ文件上運行`tail`。如果作業在寫入磁盤時中止,則此讀取將是最後一行。此錯誤消息可能意味著文件被截斷並且缺少讀取。與其他數據相比,該讀取沒有太大的問題。最好再次運行數據處理,以確保文件完整。
五 答案:
winni2k
2018-11-09 15:23:58 UTC
view on stackexchange narkive permalink

不要這樣做::您的FASTQ文件格式錯誤或FASTQ記錄跨越四行以上,這在FASTQ中是允許的。有關FASTQ解析中可能出問題的詳細說明,請參見例如 http://biopython.org/DIST/docs/api/Bio.SeqIO.QualityIO-module.html#FastqGeneralIterator。。 p>

如果FASTQ格式錯誤,那麼您應該首先問自己這是怎麼發生的,並解決問題的根源。如果記錄是有效的FASTQ,則建議使用例如 FastqGeneralIterator 解析讀取的內容,然後將解析的結果以每記錄4行的形式轉儲回FASTQ。

terdon
2018-10-30 14:40:39 UTC
view on stackexchange narkive permalink

如果您100%確信只讀行有4行(它們可以有更多行),則可以使用以下 sed 命令:

  sed -i。 bak'/ ^ @ HWI-D00466:116:CC62WANXX:3:1102:7363:63646 1:N:0:GCACACG /,+ 3d' 

-i。 bak 使 sed 修改原始文件並創建具有相同名稱和擴展名 .bak 的備份副本。該命令僅表示“刪除與模式匹配的行和接下來的三行”。

也許應該將“ @”添加到模式中。如果讀取的名稱也位於“ +”行,會發生什麼情況?
Daniel Standage
2018-11-01 20:20:17 UTC
view on stackexchange narkive permalink

在我可以的時候,我喜歡本著UNIX工具的精神逐行進行文件處理。您可以使用 paste 將Fastq文件中的4行讀入4個製表符分隔的值中,然後使用 grep 過濾掉相關記錄。 (然後,您只需將製表符變回換行符即可。)

 粘貼----< reads.fastq \ | grep -v'HWI-D00466:116:CC62WANXX:3:1102:7363:63646' tr'\ t''\ n'\ > reads-fixed.fastq  

但是,Fastq文件中的其他讀取也有可能損壞,在這種情況下,最好用Python或其他某種語言編寫腳本,該腳本會丟棄所有讀取長度與質量字符串長度不匹配的讀取。

但是,當然最重要的問題是:第一個數據如何損壞?地點?該文件來自哪裡,並對它執行了哪些預處理步驟?擺脫這種讀取(或序列/質量長度不匹配的所有讀取)會為您解決問題嗎?這些不是我們可以為您解答的問題,但可能值得您提供很好的答案。 :-)

conchoecia
2018-10-31 20:41:27 UTC
view on stackexchange narkive permalink

這是一個 awk 單行代碼,可以正常工作,與 bioawk 答案不同。

這會刪除所有fastq記錄實例,其中seq和qual字段的長度不匹配。同樣,附加 |

  zcat bad_file.fq.gz | gzip >filtered.fastq.gz 以gzip輸出。 awk'{pos = NR%4; if(pos == 1){h =  $ 0}否則if(pos == 2)\ {s = $ 0} else if(pos == 3){c = $ 0} else if(pos == 0)\ {q = $  span> 0; if(length(q)== length(s)){printf(“%s \ n%s \ n%s \ n%s \ n”,h,s,c,q)}}'' 

在前兩行的末尾刪除 \ 字符,以使其易於粘貼到終端中。

此處是的較短版本@terdon

  zcat file.fastq.gz也是如此。 awk'{record [++ k] =  $ 0; if(NR%4 == 2){slen = length($ 0)}否則if(NR%4 == 0){if(length($  span> 0)== slen){for(i record) {print record [i]}} k = 0; }}' 
呵呵,我也是在寫一個:)這是我想出的,它比您的要短:`zcat file.fastq.gz | awk'{record [++ k] = $ 0; if(NR%4 == 2){slen = length($ 0)} else if(NR%4 == 0){if(length($ 0)== slen){for(i in record){print record [i ]}} k = 0; }}'`隨時將其添加到您的答案中。
conchoecia
2018-10-31 00:20:55 UTC
view on stackexchange narkive permalink

要對此進行概括以刪除不具有相同長度的讀段和序列質量的所有讀段,可以使用此bioawk單線:

  bioawk -cfastx'{if(length ( $ seq)== length($  span> qual)} {printf(“ @%s%s \ n%s \ n + \ n%s \ n”, $ name,$  span>註釋, $ seq,$  span> qual)}}'my_fastq.gz  

這會剝離“ fastq註釋字段”中的任何內容, + ,但幾乎幾乎沒有任何內容。

附加 | gzip >已對上述命令進行了filter.fastq.gz 過濾,以gzip輸出。

這似乎對我不起作用(Arch Linux,bioawk版本20110810)。即使更正了語法錯誤(已在您的答案中更正),它似乎在第一條記錄找到長度不相同的位置後也會退出。您可以確認它可以在您的機器上正常工作嗎?
感謝您的編輯!是的,我只是確認它適用於所有記錄。我正在使用Ubuntu 16.04。 >> bioawk --version返回awk版本20110810。看起來我上一次編譯bioawk是在2016年的github存儲庫中。
真的很奇怪我有相同的版本。您可以嘗試將長度不同的記錄作為文件中的第二個記錄的情況嗎?它不只是在那裡打印第一條記錄嗎?
我遇到了與您相同的錯誤-我使fastq文件中的第二個條目具有不同長度的seq和qual字段,並且在打印該記錄之前剛剛退出了“ bioawk”。我不知道這是否是預期的行為?我必須在上面的評論中添加一點,我只是在普通的fastq文件上嘗試了bioawk單線,沒有任何長度不匹配。糟糕!
我不知道這是怎麼打算的。聽起來像是bioawk中的錯誤。


該問答將自動從英語翻譯而來。原始內容可在stackexchange上找到,我們感謝它分發的cc by-sa 4.0許可。
Loading...