珀尔

珀尔

我试图从 fastq 文件中仅选择读数的前 10 个核苷酸:

Input:

@RONSP:03887:07268
GTAGTTATCTGAAAGGATGCATGGGAAAATTTCAATATTTTTGTATCTGTTGAGGACTTTTTTGTGAGTGACTATATGGTCAATTTTGGAGGATTTGGTACTGAG  
+  
69;::5:<<<<<<3<5<<<;:67717<=0@@9;:5::;;;?-;::::;;;5=;;5:888777)79:::;A;;;<<<<<7<::5:;=/706:5:<=3;5;;;<;;:  

@RONSP:09389:11828 
GTGTGTCTCTGTTCAGTTTCTGCTTCCAGGATCTGTCTCTTGGTGAGAGTGTGGTCTTGAAGTCTCCCAGTATTATTTTATGAGGTGCAATGTGTGCTTTGATCTTTAGCAAAGTGTATTTAATGAATGTGGCTGCTCTTGCATTTAGAGCATAGACATTCAGAATTGAG  
+  
8:::<<<<;<;;5;;:;;1;;?::4:5:;5888::<;<<<6<6<>?;;;;;DD7?=D5<;6<<=<>=4><==<5<<<<0<<<AA7<<;;5=>==<<:::0:<>666+599990999::<<193944.42421443668849:88919;;;;;<<;;<9928;=;5<4:9:  




Output:

@RONSP:03887:07268
GTAGTTATCT 
+  
69;::5:<<<  

@RONSP:09389:11828
GTGTGTCTCT
+  
8:::<<<<;< 

大多数工具从读取的末尾开始修剪。但我只需要读数的前 10 个核苷酸。

任何想法都非常感激。

答案1

$ sed -E '/^[^@+]/s/^(.{10}).*$/\1/' fastq

@这将对所有不以或开头的行执行替换+。替换将仅用该行的前 10 个字符替换整行。

替代配方:

$ sed -E 's/^([^@+].{10}).*$/\1/' fastq

答案2

awk

awk '{print /^@/ ? $0 : substr($0,1,10)}' file

巴什

while IFS= read -r line; do 
    [[ $line == @* ]] && echo "$line" || echo "${line:0:10}"
done < file

答案3

珀尔

perl -lpe '/^[@+]/ or $_ = (unpack "A10A*")[0]'  your_fastq_file

塞德

sed -ne '/^[^@+]/s/./&\n/10;P'  your_fastq_file

重击

dots10=$(yes '.' | head -10 | tr -d '\n')
while IFS= read -r line
do
   case $line in [!@+]* ) expr "$line" : "\($dots10\)";; * ) echo "$line";; esac
done < your_fastq_file

答案4

我知道这是一个老问题,但在遵循建议的解决方案时遇到了问题。由于 fastq 文件中的质量值可能包含 @ 或 + 字符,因此这些质量值行有时可能以这些字符开头。

我的建议是只取每偶数行的前 10 个字符:

sed -E 'n; s/^(.{10}).*$/\1/' fastq

相关内容