Bash 如何使用文件中的行作为grep的关键字?

Bash 如何使用文件中的行作为grep的关键字?,bash,grep,cat,Bash,Grep,Cat,我在这里和其他网站上搜索了很多问题,人们提出了一些可以解决我问题的建议,但我认为我的代码有一些问题,我就是不知道 我有24个来自NGS测序的.fasta文件,长150bp。每个文件大约有100万次读取。读取来自定向测序,我们在载体上电镀感兴趣基因的cDNA和一个独特的条形码序列。我需要查看序列文件,看是否存在与特定基因对应的条形码序列 我有一个条形码序列的.txt列表,我想传递给grep在.fasta文件中查找条形码。我试过这么多不同的命令。我可以单独给grep每个条形码,但这太费时了,我知道可

我在这里和其他网站上搜索了很多问题,人们提出了一些可以解决我问题的建议,但我认为我的代码有一些问题,我就是不知道

我有24个来自NGS测序的.fasta文件,长150bp。每个文件大约有100万次读取。读取来自定向测序,我们在载体上电镀感兴趣基因的cDNA和一个独特的条形码序列。我需要查看序列文件,看是否存在与特定基因对应的条形码序列

我有一个条形码序列的.txt列表,我想传递给grep在.fasta文件中查找条形码。我试过这么多不同的命令。我可以单独给grep每个条形码,但这太费时了,我知道可以给它条形码序列列表并搜索每个。fasta查找每个条形码,并记录每个文件中找到每个条形码的次数

这是我的代码,我分别给出每个条形码:

# Barcode 33
mkdir --mode 755 $dir/BC33
FILES="*.fasta"
for f in $FILES;      do                      
cat "$f" | tr -d "\n" | tr ">" "\n" | grep 'TATTAGAGTTTGAGAATAAGTAGT' > $dir/BC33/"$f"
                      done
dir="/home/lozzib/AG_Barcode_Seq/"
cd $dir
FILES="*.fasta"
for f in $FILES;      do                                              
cat "$f" | tr -d "\n" | tr ">" "\n" | grep -c -f BarcodeScreenSeq.txt | sort > $dir/Results/"$f"
echo "Finished $f"
                      done
我尝试对其进行调整,以便不必单独输入每个条形码序列:

# Barcode 33
mkdir --mode 755 $dir/BC33
FILES="*.fasta"
for f in $FILES;      do                      
cat "$f" | tr -d "\n" | tr ">" "\n" | grep 'TATTAGAGTTTGAGAATAAGTAGT' > $dir/BC33/"$f"
                      done
dir="/home/lozzib/AG_Barcode_Seq/"
cd $dir
FILES="*.fasta"
for f in $FILES;      do                                              
cat "$f" | tr -d "\n" | tr ">" "\n" | grep -c -f BarcodeScreenSeq.txt | sort > $dir/Results/"$f"
echo "Finished $f"
                      done
但它并不是在搜索条形码序列。通过此迭代,它只返回
/Results
目录中的空文件。我还尝试了一个嵌套循环,在该循环中,我尝试将条形码序列设置为一个变量,该变量会像
$FILES
一样发生变化,但这只会给我一个新文件,其中包含.fasta文件的名称:

dir="/home/lozzib/AG_Barcode_Seq/"
cd $dir    
FILES="*.fasta"
for f in $FILES;      do                        
for b in `cat /home/lozzib/AG_Barcode_Seq/BarcodeScreenSeq.txt`; do                   
cat "$f" | grep -c "$b" | sort > $dir/"$f"_Barcode
                      done   ;
                      done    
我想要一个输出.txt文件,该文件具有:

<barcode sequence>: <# of times that bc was found> 
编辑

lozzib@gliaserver:~/AG_Barcode_Seq$ file BarcodeScreenSeq.txt
BarcodeScreenSeq.txt: ASCII text, with CRLF line terminators

您可以一次读取一行文本文件,并使用重定向分别处理每行,如下所示:

for f in *.fasta; do 
    while read -r seq; do
        grep -c "${seq}" "${f}" > "${dir}"/"${f}"_Barcode
    done < /home/lozzib/AG_Barcode_Seq/BarcodeScreenSeq.txt
done
用于f in*.fasta;做
而read-r seq;做
grep-c“${seq}”“${f}”>“${dir}”/“${f}”条形码
完成
Windows行结束符 您的
BarcodeScreenSeq.txt
具有windows行结尾。每行以特殊字符结尾
\r\n
。诸如
grep
之类的Linux工具只处理Linux行结尾
\r
并解释文件

TATTATG\r\n
ATGAAAG\r\n
...
要查找模式,
tatg\r
ATGAAG\r
。。。(注意末尾的
\r
)。由于
\r
没有匹配项

或者:通过运行
dos2unix BarcodeScreenSeq.txt
或者
sed-i的/\r//g'BarcodeScreenSeq.txt来转换文件一次。这将更改您的文件。

或:将以下脚本中的每个
BarcodeScreenSeq.txt
替换为
是否要计算条形码序列出现的行数,或条形码序列出现的次数(如果一个条形码在一行中出现两次,是否计为1次或2次)?您的
grep
是否支持
-o
选项?允许您使用Perl、Python甚至Awk吗?(还有,
150 bp长的
是什么意思?我不知道单位的缩写。)此外,您正在搜索的任何条形码是否存在重叠的风险,例如条形码1以序列GTA结尾,条形码2以序列GTA开头,如果您找到条形码1,您可能还会发现条形码2与条形码1的末端重叠?我不确定这是否是一个可能的问题;如果错过了这样的匹配,对您来说有什么关系吗?
BarcodeScreenSeq.txt
文件中有多少行?成百上千上百万还是更多?样本长度均为24个字符;它们都一样长吗?尺寸范围是多少?我想知道条形码出现的次数。它应该每行只出现一次,但不管怎样,我只想知道它被发现了多少次。我不必使用grep,我可以使用Perl或Python,但我没有编写这些类型脚本的经验,所以我先尝试了
grep
。我不确定它是否支持
-o
选项<代码>150 bp长
表示行的长度为150个碱基对或字符。我试图查看的文件是Illumina sequencer中的
.fastq
文件,我将它们转换为
.fasta
文件,以使用
grep
查找条形码序列。
BarcodeScreenSeq.txt
中有150行,对不起,我仍然不完全理解。此行:
读取时-r seq;是否执行以下操作?为什么条形码文件的路径会在末尾?
seq
只是我选择的变量名,用于表示从“BarcodeScreenSeq.txt”文件中读取的每个序列。你可以叫它任何你喜欢的名字。文件的路径位于末尾,因为这就是这种重定向的工作方式:
while read-r[line];做[用“行”做任何事];完成<[file]
一次读取文件中的一行,在
循环中对每一行执行
命令,然后循环回文件中的下一行,以此类推。如果不支持
-o
,则
grep
将打印错误。另外,我从未听说过
grep
实现不支持
-o
。您的
BarcodeScreenSeq.txt
是否有windows行结尾?请向我们显示命令
file BarcodeScreenSeq.txt
的输出。因此,第二个选项为我提供了一个文件,就像您所说的那样,它将使用BarcodeSequence:#出现次数,但我为每个样本中的每个条形码获得
0
。我知道这是不正确的,因为当我为每个条形码编写一个
grep
命令时,就像在我的原始问题中,
grep
后面列出了一个序列,我在
$file
文件中找到了条形码。我将输出作为编辑添加到原始文件中question@lozzib谢谢我以前没见过。我的猜测是正确的。您有windows行尾,需要将其转换为linux行尾运行
dos2unix BarcodeScr
for file in *.fasta; do
    grep -oFf BarcodeScreenSeq.txt "$file" |
    cat - BarcodeScreenSeq.txt |
    sort | uniq -c |
    awk '{print $2 ": " ($1 - 1) }' > "Results/$file"
done