我试图从 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