我有两个文件(重新编码和读取),它们是用nano命令构build和保存的,我想比较一下重新编码的内容,以读取和提取重叠的行。 我一直在试图用以前的逻辑创build一个when循环,但是目前为止还没有成功。 while使用grep / recode while ,输出数据与循环中指定的模式不匹配。 脚本应该读取recode.txt中的每一行,并将其与reads.fastq进行比较,在reads.txt之前提取每行匹配加一行和之后的两行,并将输出保存在不同的文件中(对于每行的所有组合匹配行recode.txt)。 这里是表和代码:
档案recode.txt :
GTGTCTTA+ATCACGAC GTGTCTTA+ACAGTGGT GTGTCTTA+CAGATCCA GTGTCTTA+ACAAACGG GTGTCTTA+ACCCAGCA GTGTCTTA+AACCCCTC GTGTCTTA+CCCAACCT ATCACGAC+AAGGTTCA GTGTCTTA+GAAACCCA
文件reads.fastq :
################################### @NB500931:113:HW53WBGX2:1:11101:11338:1049 1:N:0:ATCACGAC+AAGGTTCA GTAGTNCCAGCTGCAGAGCTGGAAGGATCGCTTGAGCGCAGAGGTAGAGGCTACAGTGAGCCGTGATCATGCCAT + AAAAA#EAAEEEEE6EAEAEEEEEEEEEEEEEEEAEEEEEE/EEEEEEEEEE/EEEEEEEEEEEEEEEAEEEEEA @NB500931:113:HW53WBGX2:1:11101:6116:1049 1:N:0:ACAAACGG+AAGGTTCA NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN + ################################### @NB500931:113:HW53WBGX2:1:11101:6885:1049 1:N:0:ACCCAGCA+ACTTAGCA GAGGGNGCTGTCCCAGTAATTGGGTTCAGATGACATTTGCTTGATTTTAGGGATGTACGAGATTTTCGTGGATC + AAA/A#EAEEEEEAEAEEA///EEAEEEEE///AEEAEE/AA//EAA<EEE/E//AEEEAAA//E/A<6//EEA @NB500931:113:HW53WBGX2:1:11101:8246:1049 1:N:0:ATCACGAC+AAGGTTCA CTTGTNAGACACGATGCAGAGAATTAGCTGTTTGATGCCTATCTTCCCAACTCAGAGGCAAGCTGCCCAAAGGC +
脚本:
Awk,tail,sed或其他 – 对于大文件哪个更快?
使用awk来alignment文本文件中的列?
如何使用awk将文件的某个字段更改为大写?
Linux脚本:search关键字的特定列
#!/bin/bash #PBS -l nodes=1:ppn=8,walltime=96:00:00 while read line do echo "working on $line" grep -A3 "$line" reads.fastq | grep -v "^--$" >> "$line"_sorted.fastq done<recode.txt
所以,这两个文件都是UNIX格式,下面的脚本(没有循环)工作顺利
根据没有循环的脚本:
grep -A3 "ATCACGAC+AAGGTTCA" reads.fastq | grep -v "^--$" > sorted_file.fastq
我的输出应该是:
@NB500931:113:HW53WBGX2:1:11101:11338:1049 1:N:0:ATCACGAC+AAGGTTCA GTAGTNCCAGCTGCAGAGCTGGAAGGATCGCTTGAGCGCAGAGGTAGAGGCTACAGTGAGCCGTGATCATGCCAT + @NB500931:113:HW53WBGX2:1:11101:8246:1049 1:N:0:ATCACGAC+AAGGTTCA CTTGTNAGACACGATGCAGAGAATTAGCTGTTTGATGCCTATCTTCCCAACTCAGAGGCAAGCTGCCCAAAGGC +
但是,我的输出使用循环, while给我一个空的文件,正确的名称。 你能帮我么?
更新:我已经尝试了dos2unix转换我的文件,并没有工作。 更新:我编辑的问题,包括我的预期输出
如何获得bashvariables在awkpipe道上工作
如何比较bash中的两个范围列表?
用awkreplaceUNIX列
没有看到预期的输出这是一个猜测,但它听起来像这是你想要做的:
$ awk -F: 'NR==FNR{a[$0];next} $NF in a{c=3} c&&c--' recode.txt reads.fastq @NB500931:113:HW53WBGX2:1:11101:8246:1049 1:N:0:ATCACGAC+AAGGTTCA CTTGTNAGACACGATGCAGAGAATTAGCTGTTTGATGCCTATCTTCCCAACTCAGAGGCAAGCTGCCCAAAGGC +
不需要shell循环(查看为什么要使用shell循环处理文本被认为是不好的练习 ),只需要将recode.txt中的值保存为数组索引然后在读取reads.fastq时,如果最后一个:-separated字段是数组的索引(即存在于recode.txt中),则将计数器设置为3,然后在计数器大于零时打印每一行,然后递减计数器每一次(参见从匹配开始的打印文本的其他示例,参见使用sed-awk-a-line-following-a-matching-pattern )。
要将每个找到的记录保存在一个文件中,这个文件是基于最终字段中的字符串名称,因为看起来您可能正在尝试在shell循环中执行下列操作:
awk -F: ' NR==FNR { a[$0]; next } $NF in a { c=3; close(out); out=$NF"_sorted.fastq" } c&&c-- { print >> out } ' recode.txt reads.fastq
请注意,只读取“reads.fastq”一次,而不是每行“recode.txt”的一行,因为您的shell循环正在执行,所以您可以从这一方面期望获得巨大的性能提升。
最后 – 如果recode.txt只是reads.fastq中存在的所有最终字段的列表,那么您根本就不需要它,这就是您需要将reads.fastq拆分为每个记录命名为3行的单独文件基于最后的值:以@开头的每行:
awk -F: ' /^@/ { c=3; close(out); out=$NF"_sorted.fastq" } c&&c-- { print >> out } ' reads.fastq
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。