使用两个文件时出现 grep 问题 - 我已经尝试了一切

grep issues when using two files - I've tried everything

我有两个文件(recode 和 reads)是用 nano 命令构建和保存的,我想比较 recode 和 reads 中的内容,并提取 reads 中重叠的行。我一直在尝试根据之前的逻辑创建一个 when 循环,但到目前为止没有成功。输出数据与循环 while 和 grep/recode 中指定的模式不匹配。该脚本应该读取 recode.txt 中的每一行与 reads.fastq 进行比较,提取每个匹配行加上 reads.txt 之前的一行和之后的 2 行,并将输出保存在不同的文件中(对于所有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
+

脚本:

#!/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 来转换我的文件,但没有用。 更新:我编辑了问题以包含我的预期输出

没有看到预期的输出,这只是猜测,但听起来这就是您要尝试做的事情:

$ awk -F: 'NR==FNR{a[[=10=]];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 循环(有关从匹配项开始打印文本的其他示例,请参阅 why-is-using-a-shell-loop-to-process-text-considered-bad-practice for SOME of the reasons why that matters), just saves the values from recode.txt as array indices and then when reading reads.fastq if the last :-separated field is an index of the array (i.e. existed in recode.txt) then set a counter to 3 and then print every line while the counter is greater than zero, decrementing the counter each time (see printing-with-sed-or-awk-a-line-following-a-matching-pattern)。

要根据最终字段中的字符串名称将找到的每条记录保存在文件中,就像您可能在 shell 循环中尝试做的那样:

awk -F: '
    NR==FNR  { a[[=11=]]; next }
    $NF in a { c=3; close(out); out=$NF"_sorted.fastq" }
    c&&c--   { print >> out }
' recode.txt reads.fastq

请注意,总共只读取 "reads.fastq" 一次,而不是像 shell 循环那样每行读取一次 "recode.txt",因此您可以期待从这方面获得巨大的性能改进一个人。

最后 - 如果 recode.txt 只是 reads.fastq 中存在的所有最终字段的列表,那么您根本不需要它,这就是拆分 [=29] 所需的全部内容=] 分为每条记录 3 行的单独文件,根据每行以 @:

开头的最后一个 : 之后的值命名
awk -F: '
    /^@/   { c=3; close(out); out=$NF"_sorted.fastq" }
    c&&c-- { print >> out }
' reads.fastq