我有一个基因列表文件。像这样的事情
SWT21
SSA1
NRP1
EFB1
TFC3
MDM10
我有另一个文件,其中还包含列表中这些基因的名称以及有关它们的其他基本信息。第二个文件如下所示:
chrI 147593 151166 YAL001C - TFC3
chrI 143706 147531 YAL002W + VPS8
chrI 142173 143160 YAL003W + EFB1
chrI 140759 141407 YAL004W + YAL004W
chrI 139502 141431 YAL005C - SSA1
chrI 137697 138345 YAL007C - ERP2
chrI 136913 137510 YAL008W + FUN14
chrI 135853 136633 YAL009W + SPO7
chrI 134183 135665 YAL010C - MDM10
我想提取第二个文件中的那些行,这些行的基因名称与第一个文件中的基因名称相同。
答案1
您所需要的只是一个简单的grep
:
grep -Fwf gene_list.txt gene_info.txt
使用的选项是:
- -w :搜索整个单词,这确保基因名称
ERK1
不会与基因匹配ERK12
(-w
不是标准选项,但相当常见) - -f :从文件中读取要搜索的模式。在这种情况下
gene_list.txt
。 - -F :将模式视为字符串,而不是正则表达式。这确保像这样的基因名称
TOR*
(如果存在这样的东西)不会匹配TORRRRRR
。
注意:这假设有没有空间围绕列表中的基因名称。如果有,您需要先删除它们(此处使用 GNU sed
):
sed -i 's/ //g' gene_list.txt
答案2
从一个例子来看awk 维基:
awk 'FNR==NR {arr[$0];next} $6 in arr' gene_list info_list
从 wiki 条目复制的解释:
FNR == NR
:当记录数等于文件中的记录数时,此测试为真。这仅适用于第一个文件,对于第二个文件,NR 将等于 file1 + FNR 的行数。arr[$0]
:这是一种通过整行创建数组元素索引的经典技术。这将创建一个包含 file1 名字的数组。next
:这将跳到下一个记录,因此不再对 file1 进行处理。$6 in arr
:这只会发生在file2的记录上,因为next.如果 $1 存在于 arr 中,即 file1 中,则将执行默认操作并打印该行。
答案3
为了更加稳健,您可以将基因列表更改为正则表达式以在行末尾进行匹配。这应该可以工作(并且与 POSIX 兼容):
sed 's/[[:space:]]*$/[[:space:]]*$/' gene_list | grep -wf - gene_info
gene_list
或者在(按照问题中的示例)中添加前导空格:
sed 's/$/[[:space:]]*$/; s/[[:space:]]//' gene_list |
grep -wf - gene_info
当然,如果基因名称中包含由正则表达式解释的字符,则这将不起作用。 Atlhough,如果是这种情况,那么您需要添加额外的替换表达式来sed
转义它们,例如s:\[:\[:
。
答案4
你也可以在linux中使用grep命令,通过给出像egrep -wi“完整的基因列表(1)与基因之间的诱导管道”“文件名包含所有基因(2)”这样的命令。这里genelist(1)是你的基因列表说它是20数量和基因 (2) 包含完整基因的文件(数量 1000)