両方のファイルから 1 行だけ一致し、ファイル 2 から列全体を返します。

両方のファイルから 1 行だけ一致し、ファイル 2 から列全体を返します。

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

つまり、-fgrepオプションはあなたを検索し、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例えばのパターンを使用します905894file2行がある場合は、最初の6文字と一致するので一致します9058940905894それは間違っています。したがって、単語全体を一致させる必要があります。たとえば、単語の始まりと終わりに一致するようにパターンを変更できますが、次のような一般的な'\b905894\b'ケースgrepのオプションがあります-w

grep -F -w -f file1 file2       

ヘッダーを除外

Reference Positionヘッダーは両方のファイルに表示されるため、ヘッダーを表示するのが技術的に正しい場合でもヘッダーは必要ありません。

を使用してtail -n +22行目から始まる行を選択し、それをファイル名として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

関連情報