パターン行に一致する行を表示する Grep

パターン行に一致する行を表示する Grep

次の2つのファイルがあるとしましょう。

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

どうすればいいですか?私はループを使って最初のファイルを1行ずつ解析forし、その行を変数に保存できると思いましたが、成功しませんでした。

私はWindowsでCygwinシェルを使用しています。

答え1

これをファイルに保存してpatterns.awkを呼び出します。awk -f patterns.awk patterns dataここで、patterns最初のファイルはどこにあり、data2番目のファイルは次のようになります。

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;
        }
    }
}

仕組みは次のとおりです。スキーマファイルを読み取るときは、最初のルールが使用されます。つまり、レコードの総数がファイルのレコード数と同じであることを意味します。検索する行とパターンを2つの配列に保存し、続行します。 2番目の規則は、合計レコード数がファイル内のレコード数を超える場合、つまりデータファイルを読み取るときに使用されます。行の最初の列に一致するパターンがあることを確認します。その場合は、パターンファイルから一致する行を印刷し、データファイルから一致する行を印刷します。

関連情報