
2つのファイルがある場合
ファイル1:
Reference Position
905894
1197693
3703749
92108275
114940633
114940633
ファイル2:
Mapping Reference Position Type Length Reference Allele Linkage Zygosity Count
1 mapping 877831 SNV 1 T C Homozygous 48
1 mapping 883625 SNV 1 A G Homozygous 23
1 mapping 905894 SNV 1 C T Heterozygous 41
1 mapping 909768 SNV 1 A G Homozygous 85
1 mapping 1153944 SNV 1 T G Heterozygous 65
1 mapping 1197693 SNV 1 G A Heterozygous 23
1 mapping 1276973 SNV 1 G C Heterozygous 4
1 mapping 1276974 Insertion 4 - ACAC Heterozygous 52
1 mapping 1277533 SNV 1 T C Homozygous 73
両方のファイルの参照位置を一致させ、ファイル1に一致するファイル2の完全な列を返したいと思います。
答え1
使用するとegrep
役に立ちます。努力する:
grep -E '(905894|1197693|3703749|92108275|114940633)' file2
提供されたパターンが表示されていることを確認してくださいfile1
。テストしてみると、このような結果が出ました。
[rkahil@xxxxxx ~]$ grep -E '(905894|1197693|3703749|92108275|114940633)' file2
1 mapping 905894 SNV 1 C T Heterozygous 41
1 mapping 1197693 SNV 1 G A Heterozygous 23
答え2
数値を一致させるには、grepを使用して行を返します。
$ grep 883625 file2
1 mapping 883625 SNV 1 A G Homozygous 23
file2
数字を含むすべての行を出力するには、次のようにしますfile1
。
$ grep -f file1 file2
Mapping Reference Position Type Length Reference Allele Linkage Zygosity Count
1 mapping 905894 SNV 1 C T Heterozygous 41
1 mapping 1197693 SNV 1 G A Heterozygous 23
つまり、-f
grepオプションはあなたを検索し、file1
で一致するものを見つけようとしますfile2
。ここでも、タイトルはの最初の行と一致しますfile1
。からman grep
:
-f FILE, --file=FILE
Obtain patterns from FILE, one per line. The empty file
contains zero patterns, and therefore matches nothing.
答え3
grep
ファイルで読み取りモードを使用する
行全体をfile1
固定文字列パターンとして使用できます。このオプションは、パターンを正規表現として解釈しないように指示-F
します。 Grep はオプションで、1 行に 1 つのパターンでファイルを読み取ることができます。これがまさに私たちが持っているものなので、パターンをファイルから直接読むことができます。grep
-f
$ grep -F -f file1 file2
Mapping Reference Position Type Length Reference Allele Linkage Zygosity Count
1 mapping 905894 SNV 1 C T Heterozygous 41
1 mapping 1197693 SNV 1 G A Heterozygous 23
部分文字列の一致を防ぐ
上記のコマンドは、file1
例えばのパターンを使用します905894
。file2
行がある場合は、最初の6文字と一致するので一致します9058940
。905894
それは間違っています。したがって、単語全体を一致させる必要があります。たとえば、単語の始まりと終わりに一致するようにパターンを変更できますが、次のような一般的な'\b905894\b'
ケースgrep
のオプションがあります-w
。
grep -F -w -f file1 file2
ヘッダーを除外
Reference Position
ヘッダーは両方のファイルに表示されるため、ヘッダーを表示するのが技術的に正しい場合でもヘッダーは必要ありません。
を使用してtail -n +2
2行目から始まる行を選択し、それをファイル名としてstdinから出力を-
読み込みます。tail
$ tail -n +2 file1 | grep -F -w -f - file2
1 mapping 905894 SNV 1 C T Heterozygous 41
1 mapping 1197693 SNV 1 G A Heterozygous 23
Bashではほぼ同じです。
grep -F -w -f <(tail -n +2 file1) file2