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