両方のファイルの最初の列に基づいて一致する行を除外します。

両方のファイルの最初の列に基づいて一致する行を除外します。

2つのタブで区切られたテキストファイルがあります。より大きなデフォルトファイルであるファイル1には複数の列がありますが、ファイル2は、制限された行の最初の2つの列のみがファイル2と共有する小さなファイルです。

File 3を出力として持ち、2つのファイルの最初の列の間に一致する行を除いて、File 1の他のすべての列を印刷したいと思います。

試してみましたがgrep -vfうまくいかないようです。また、両方の列の一致が必要です。

ファイル1:

BP  CHR SNP REF ALT A1  OBS_CT  OR  LOG(OR)_SE  Z_STAT  P
1650048 1   rs112618790 C   T   T   12387   1.00246 0.0877604   0.0279678   0.977688
1856473 1   rs6684487   G   A   A   12387   1.02222 0.0836593   0.262689    0.79279

ファイル2:

BP  CHR
1650048 1
1650483 1

出力(ファイル3):

BP  CHR SNP REF ALT A1  OBS_CT  OR  LOG(OR)_SE  Z_STAT  P
1856473 1   rs6684487   G   A   A   12387   1.02222 0.0836593   0.262689    0.79279

ベストアンサー1

ファイルが最初のフィールドに基づいてソートされていると仮定すると、次のコマンドを使用して、最初のフィールドが2番目のファイルに表示されない最初のファイルのすべてのレコードを抽出できます。

$ join -v 1 file1 file2
1856473 1 rs6684487 G A A 12387 1.02222 0.0836593 0.262689 0.79279

タブ区切り記号とタイトルを保持するには:

$ head -n 1 file1; join -t $'\t' -v 1 file1 file2
BP      CHR     SNP     REF     ALT     A1      OBS_CT  OR      LOG(OR)_SE      Z_STAT  P
1856473 1       rs6684487       G       A       A       12387   1.02222 0.0836593       0.262689        0.79279

一致のために最初と2番目のフィールドの両方を使用するには、両方のファイルのこれらのフィールドに基づいて結合された新しい最初のフィールドを作成し、そのフィールドに結合してから一時結合フィールドを削除します。これは基本的に次のようなものを実装します。装飾 - 並べ替え - 装飾キャンセルしかし、ソートにはリレーショナルJOIN操作を使用します。

次のコードでは、シェルを使用できると仮定しています<(...)

$ head -n 1 file1; join -t $'\t' -v 1 <( awk -F '\t' 'BEGIN { OFS=FS } { print $1 "_" $2, $0 }' file1 ) <( awk -F '\t' 'BEGIN { OFS=FS } { print $1 "_" $2, $0 }' file2 ) | cut -f 2-
BP      CHR     SNP     REF     ALT     A1      OBS_CT  OR      LOG(OR)_SE      Z_STAT  P
1856473 1       rs6684487       G       A       A       12387   1.02222 0.0836593       0.262689        0.79279

または、ヘルパーシェル機能を使用してコマンドを読みやすくします。

$ decorate () {  awk -F '\t' 'BEGIN { OFS=FS } { print $1 "_" $2, $0 }' "$1"; }
$ head -n 1 file1; join -t $'\t' -v 1 <( decorate file1 ) <( decorate file2 ) | cut -f 2-
BP      CHR     SNP     REF     ALT     A1      OBS_CT  OR      LOG(OR)_SE      Z_STAT  P
1856473 1       rs6684487       G       A       A       12387   1.02222 0.0836593       0.262689        0.79279

おすすめ記事