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