次の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
最初のファイルはどこにあり、data
2番目のファイルは次のようになります。
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番目の規則は、合計レコード数がファイル内のレコード数を超える場合、つまりデータファイルを読み取るときに使用されます。行の最初の列に一致するパターンがあることを確認します。その場合は、パターンファイルから一致する行を印刷し、データファイルから一致する行を印刷します。