假设我有这两个文件:
1.
Locus_1 univ
Locus_2 anc
Locus_3 cat
2.
university GO:000001
impromptu GO:000002
advanced GO:000003
inheritance GO:000004
我想对文件 #2 上的文件 #1 的 $2 执行 grep -f,但我还想检索第一个文件的行以及与文件 #1 的 $2 匹配的文件 #2 的整行。
基本上,我希望我的输出是这样的
Locus_1 univ university GO:000001
Locus_2 anc advanced GO:000003
我怎样才能做到这一点?我以为我可以用循环逐行解析第一个文件for
,然后将该行存储在变量中,但我没有成功。
我在 Windows 上使用 Cygwin shell。
答案1
将其保存到文件中,假设patterns.awk
,然后调用awk -f patterns.awk patterns data
,patterns
第一个文件在哪里,data
第二个文件在哪里:
NR == FNR {
prefix[NR] = $0;
pattern[NR] = $2;
count++;
next;
}
{
for (i = 1; i <= count; i++) {
if (index($1, pattern[i]) > 0) {
print prefix[i] " " $0;
next;
}
}
}
其工作原理如下:当我们读取模式文件时,使用第一个规则,即记录总数等于文件中的记录数。它将要搜索的行和模式保存在两个数组中并继续。一旦记录总数超过文件中的记录数,即当我们读取数据文件时,就使用第二条规则。它检查是否有任何模式与该行的第一列匹配。如果是,它将打印模式文件中的匹配行,然后打印数据文件中的匹配行。