5つの列を使用してファイルのサブセットを抽出する

5つの列を使用してファイルのサブセットを抽出する

2つのファイルがあります。 1つはbiiiiiigファイル(249430行)で、もう1つは最初のファイル(500行)より小さいです。

最初のファイルには、この5つの列と他の列(2番目のファイルの最初の5つの列と同じ)があります。

#CHROM     POS         ID          REF      ALT     QUAL    INFO 
chr2       32424454        rs4576493      T       G       pass    ......
chr8       35578788        rs3686678      C       A        pass .........
chr8       35578788        rs3686678      C       CCG      pass .........
chrx       35578788        rs3686678      C       CCG      pass .........

2番目のファイルには5つの列があります。たとえば、次のようになります。

#CHROM     POS         ID          REF      ALT
chr2       32424454        rs4576493      T       G
chr8       35578788        rs3686678      C       CCG

2番目のファイルの5番目の列を最初のファイルと比較してから、ファイル間の交差行のみを保存したいのですが(ファイル1のすべての列を含む)。

だから私が望む最終ファイルは次のようになります

#CHROM     POS         ID          REF      ALT     QUAL    INFO 
chr2       32424454        rs4576493      T       G       pass    ......
chr8       35578788        rs3686678      C       CCG      pass .........

Unixでは何をすべきですか?ありがとう

答え1

awkを使用してください。

awk '
    { key = $1 FS $2 FS $3 FS $4 FS $5 }
    NR==FNR { a[key]; next }
    key in a
' file2 file1

答え2

両方のファイルがTSVファイル、つまりタブで区切られたファイルであると仮定すると、次のようになります。ミラーmlr;構造化データ操作用に特別に開発されたツール)は、上記の5つのフィールドを使用して、2つのデータセット間のリレーショナルINNER JOIN操作を実行します。

$ mlr --tsv join -f firstfile -j '#CHROM,POS,ID,REF,ALT' secondfile
#CHROM  POS     ID      REF     ALT     QUAL    INFO
chr2    32424454        rs4576493       T       G       pass    ......
chr8    35578788        rs3686678       C       CCG     pass    .........

データが単一のタブの代わりに複数のスペースを使用する場合は、入力と出力の両方を「きれいに印刷」したいことを示す--pprintために代わりに使用します。 (またはおよび)を--tsv使用して入力を「きれいな印刷」形式で読み取り、出力をTSVに書き込みます。--p2t--ipprint--otsv

関連情報