ファイルBの行がファイルAの複数の列と一致する場合は、ファイルAの行を削除し、一致する行をファイルCに配置し、一致しない行をファイルDに配置します。

ファイルBの行がファイルAの複数の列と一致する場合は、ファイルAの行を削除し、一致する行をファイルCに配置し、一致しない行をファイルDに配置します。

2つのファイルがあります -ファイルAこれは10個以上の列と約15,000個の行で構成される基本ファイルです。文書B4つの列と約1500の行が含まれています。

一度に各行をインポートしたいです。文書B、対応する列を次の対応する列と一致させます。ファイルA(両方のファイルの順序は異なりますが、列ヘッダーは同じです。)4つの列がすべて一致する場合文書B存在するファイルAを押してから、行全体を削除します。ファイルA、新しいファイル(ファイルC)。

一致しない行も必要です。文書B新しいファイル(ファイルD)。

例:

ファイルA:

individual_id   study_id.x  chromosome  g_start gene    referencel1hs   SampleFile_num  id  sample_name
54  Baillie2011 4   57497067    na  no  612 612 DonorAR2
54  Baillie2011 X   154790187   TMLHE   no  612 612 DonorAR2
54  Baillie2011 5   159351203   ADRA1B  no  612 612 DonorAR2
54  Baillie2011 13  79259801    na  no  612 612 DonorAR2
54  Baillie2011 8   4452925 CSMD1   no  610 610 DonorAH

ファイルB:

study_id.x  sample_name chromosome  g_start
Baillie2011 DonorAH 8   4452925
Baillie2011 DonorBC 9   5491376
Baillie2011 DonorAH 8   5829283
Baillie2011 DonorCH 8   5829283

結果:

ファイルA:

individual_id   study_id.x  chromosome  g_start gene    referencel1hs   SampleFile_num  id  sample_name
54  Baillie2011 4   57497067    na  no  612 612 DonorAR2
54  Baillie2011 X   154790187   TMLHE   no  612 612 DonorAR2
54  Baillie2011 5   159351203   ADRA1B  no  612 612 DonorAR2
54  Baillie2011 13  79259801    na  no  612 612 DonorAR2

ファイルC:

individual_id   study_id.x  chromosome  g_start gene    referencel1hs   SampleFile_num  id  sample_name
54  Baillie2011 8   4452925 CSMD1   no  610 610 DonorAH

ファイルD:

study_id.x sample_name chromosome g_start
Baillie2011 DonorBC 9 5491376 
Baillie2011 DonorAH 8 5829283 
Baillie2011 DonorCH 8 5829283

ベストアンサー1

次のようにawkスクリプトを使用します。

NR == FNR {
        strt=1
        }
NR != 1 && FNR ==1 {
        strt=0
        }
strt == 1 {
        fileB[FNR"_"$1$2$3$4]=$0
        }
strt == 0 {
        fileA[$2$9$3$4]=$0
        }
END {
        for (i in fileB) {
                split(i,arry,"_")
                if (fileA[arry[2]] != "") {
                                print fileA[arry[2]] > "fileC"
                                system("sed -i \"/"fileA[arry[2]]"/d\" 
fileA") 
                }
                else {
                                 print fileB[i] > "fileD"
                }
        }

まず、各ファイルの行を fileA と fileB という 2 つの配列として読み込み、両方とも「Baillie2011DonorAH84452925」という同じキーを持っています。 fileB 配列の各項目を繰り返し、fileA に対応する項目があることを確認します。存在する場合は、印刷リダイレクトを介してfileCにエントリを追加し、awkのシステム機能を介してsedコマンドを実行します(注 - システム機能にはコード挿入のリスクがあるため、それに応じてリスクを評価してください)。一致するものがない場合は、その行を文書に出力します。ディ。

アクション:

awk -f awkscriptfile fileB fileA

おすすめ記事