我必须从 fastq 文件中检索已知长度的特定信息并将其添加到另一个位置。
例如,给出以下 fastq 文件作为输入:
@SRR5394526.1 1 length=150
CGATGTTAAATCAACGATAACTACACCG
+SRR5394526.1 1 length=150
AA<AFJFJJJJJJJJJJAJJJJJJJJJF
我想要作为输出:
@SRR5394526.1.CGATGT 1 length=150
TAAATCAACGATAACTACACCG
+SRR5394526.1.CGATGT 1 length=150
FJJJJJJJJJJAJJJJJJJJJF
您可以注意到,前 6 个核苷酸既从第二行的序列中删除,也从第四行的序列中删除,并附加在第一行和第三行的第一个数字 1 之后。我的文件中有数百万个这种大小的块(4 行),这只是一个示例。
我已经找到了如何在文件中添加/附加信息:sed 's/myinfo/&,/4'
以及如何删除文件中的信息sed -e '423s!//!!; 424s!printf!//&!'
,但这还不够。任何想法都非常感激。
答案1
使用awk
:
awk '(FNR-1) % 2 == 0 { name=$1; chr=$2; len=$3; next }
(FNR-2) % 4 == 0 { seq=substr($0,1,6) }
{ print name "." seq, chr, len
print substr($0,7) }' file.fastq >newfile.fastq
该awk
程序分为三个块。
第一个块从第一行开始,每隔两行(序列和质量数据标题行)触发一次。它将该行的三位信息保存到三个变量中。然后它立即跳到下一行输入。
第二个块将序列行中的前 6 个字符提取到 中
seq
,但仅适用于从第 2 行开始的第四行(仅限序列行)。最后一个块仅在第一个块未处理的行(每个序列或质量数据行)上运行并构造输出。
gzip
要在压缩文件上使用它(或bgzip
-压缩文件,常用于生物信息学项目),使用
zcat file.fastq.gz | awk '...' | bgzip -c >newfile.gz
要使用变量作为用于切割的值,请考虑
awk -v n=6 '(FNR-1) % 2 == 0 { name=$1; chr=$2; len=$3; next }
(FNR-2) % 4 == 0 { seq=substr($0,1,n) }
{ print name "." seq, chr, len
print substr($0,n+1) }'
其中-v n=6
控制切割的长度。
您还可以将实际awk
代码(单引号内的所有内容)放入其自己的脚本文件中,并将其用作
awk -v n=6 -f script.awk file.fastq
答案2
fastq 文件中的数据,在 4 x 4 行上使用 gnu sed,
$ sed -nE ' N;N;N;s/(.+\.1)(\s.+\n)(.{6})(\w+)\s*(\n.+\.1)(.+\n).{6}(\w+)/\1.\3\2\4\5.\3\6\7/p' fastq
@SRR5394526.1.CGATGT 1 length=150
TAAATCAACGATAACTACACCG
+SRR5394526.1.CGATGT 1 length=150
FJJJJJJJJJJAJJJJJJJJJF