use*_*373 7 grep awk text-processing
我有一个基因列表文件。像这样的事情
SWT21
SSA1
NRP1
EFB1
TFC3
MDM10
Run Code Online (Sandbox Code Playgroud)
我还有另一个文件,其中也包含我列表中这些基因的名称以及有关它们的其他基本信息。第二个文件看起来像这样:
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
Run Code Online (Sandbox Code Playgroud)
我想在第二个文件中提取那些具有第一个文件中存在的基因名称的行。
ter*_*don 10
您只需要一个简单的grep
:
grep -Fwf gene_list.txt gene_info.txt
Run Code Online (Sandbox Code Playgroud)
使用的选项是:
ERK1
不会与基因匹配ERK12
(-w
不是标准选项但很常见)gene_list.txt
。TOR*
(如果存在这样的东西)这样的基因名称不会匹配TORRRRRR
。注意:这假设您的列表中的基因名称周围没有空格。如果有,您需要先删除它们(此处使用 GNU sed
):
sed -i 's/ //g' gene_list.txt
Run Code Online (Sandbox Code Playgroud)
从awk wiki上的一个例子:
awk 'FNR==NR {arr[$0];next} $6 in arr' gene_list info_list
Run Code Online (Sandbox Code Playgroud)
从维基条目复制的解释:
FNR == NR
: 当记录数等于文件中的记录数时,此测试为真。这仅适用于第一个文件,对于第二个文件,NR 将等于 file1 + FNR 的行数。arr[$0]
:这是一种经典的技术,可以通过整行创建数组元素索引。这将创建一个具有 file1 名字的数组。next
:这将跳到下一条记录,因此不再对文件 1 进行处理。$6 in arr
: 这只会发生在 file2 的记录上,因为下一个。如果 $1 存在于 arr 中,即在 file1 中,则将执行默认操作并打印该行。