我有一个文件,其中列出了一些id:
id1
id2
id3
etc
我想使用这些id从文件中提取数据(id发生在每个文件中),并将这些id中的每个id的输出保存到一个单独的文件(id是蛋白质家族名称,我想从特定家族中获取每个蛋白质)。而且,当我有了每个蛋白质的名称时,我想用这个名称来获得这些蛋白质(.fasta
格式),这样它们就会按它们的家族分组(它们将保持在同一组中)
所以我试着这样做(我知道它会把所有的id转储到一个文件):
#! /bin/bash
for file in *out
do grep -n -E 'id1|id2|id3' /directory/$file >> output; done
我将感谢任何帮助,如果不是一切都清楚,我将很高兴说明。
编辑:我会尽量澄清,抱歉给您带来不便:
有一个文件名为"pfamacc"内容如下:
PF12312
PF43555
PF34923
等等-这些是我需要访问其他文件的id,这些文件的结构类似于"something_something.faa.out">
<acc_number> <aligment_start> <aligment_end> <pfam_acc>
RXOOOA 5 250 PF12312
OC2144 6 200 PF34923
我需要这些加入编号,这样我就可以从看起来像这样的文件中获得蛋白质序列:
>RXOOOA
ASDBSADBASDGHH
>OC2144
SADHHASDASDCJHWINF
假设在与后续内容相同的目录下有一个文件ids_file.txt
:
id1
id2
id3
id4
在同一目录下还有一个名为id1
的文件,其内容如下:
Bla bla bla
id1
and id2
is
here id4
下面的脚本可以帮到你:
#!/bin/sh
IDS=$(cat ids_file.txt)
IDS_IN_ONE=$(cat ids_file.txt | tr 'n' '|' | sed -r 's/(|)?|$//')
echo $IDS_IN_ONE
for file in $IDS; do
grep -n -E "$IDS_IN_ONE" ./$file >> output
done
文件output
然后有以下结果:
2:id1
3:and id2
5:here id4
读取一个列表需要被交叉引用以获得第二个列表,然后需要用于收集fasta。
从以下3个文件开始…
starting_values.txt
PF12312
PF43555
PF34923
cross_reference.txt
<acc_number> <aligment_start> <aligment_end> <pfam_acc>
RXOOOA 5 250 PF12312
OC2144 6 200 PF34923
find_from_file.fasta
>RXOOOA
ASDBSADBASDGHH
>OC2144
SADHHASDASDCJHWINF
SADHHASDASDCJHWINF
>NC11111
IURJCNKAERJKADSF
for i in `cat starting_values.txt`; do awk -v var=$i 'var==$4 {print $1}' cross_reference.txt; done > needed_accessions.txt
如果多行FASTA变为单行。https://www.biostars.org/p/9262/
awk '/^>/ {printf("n%sn",$0);next; } { printf("%s",$0);} END {printf("n");}' find_from_file.fasta > find_from_file.temp
for i in `cat needed_accessions.txt`; do grep -A 1 "$i" find_from_file.temp; done > found_sequences.fasta
最终输出……
found_sequences.fasta
>RXOOOA
ASDBSADBASDGHH
>OC2144
SADHHASDASDCJHWINFSADHHASDASDCJHWINF