显示模式行和匹配行的 Grep

显示模式行和匹配行的 Grep

假设我有这两个文件:

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 datapatterns第一个文件在哪里,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;
        }
    }
}

其工作原理如下:当我们读取模式文件时,使用第一个规则,即记录总数等于文件中的记录数。它将要搜索的行和模式保存在两个数组中并继续。一旦记录总数超过文件中的记录数,即当我们读取数据文件时,就使用第二条规则。它检查是否有任何模式与该行的第一列匹配。如果是,它将打印模式文件中的匹配行,然后打印数据文件中的匹配行。

相关内容