フィールドを共有する別のファイルの対応する文字列をあるファイルに追加するにはどうすればよいですか?

フィールドを共有する別のファイルの対応する文字列をあるファイルに追加するにはどうすればよいですか?

「腫瘍ID」フィールドを持つ2つのファイルがあります。両方ともコンマで区切られます。ファイル2の一意のフィールドをファイル1に追加する必要があり、「腫瘍ID」の対応する文字列に基づいてそのフィールドの行を追加したいと思います。例の形式は次のとおりです。

ファイル1

Tumor_ID, Chromosome, start, end,
xxxxx,       2,        12,    13,
xxxxx,       3,        45,    46,
xxxxx,       3,        48,    49
xxxxx,       3,        51,    52,
nnnnn,       5,       55,    59,
nnnnn,       5,       57,    58,
lllll,      11,       13,    14,
lllll,      12,        16,    17,
eeeee,       2,        51,    52,
zzzzz,       9,      1000,   101,

ファイル2

Patient_No., Tumor_ID,  Normal_ID, 
4,            xxxxx,     hhhhh,            
5,            nnnnn,     aaaaa,          
8,            lllll,     ddddd,     
7,            eeeee,     ggggg,     
3,            zzzzz,     nnnnn,      

ファイル1から新しいフィールド(-f15など)を作成し、ファイル2のNormal_ID値を新しく作成されたファイル1フィールドの対応するTumor_ID値に割り当てるにはどうすればよいですか。私の質問は理解できますか?

答え1

これは効果的な解決策ですが、さらなる改善が必要な場合があります。

データをカンマで区切るために、file2のすべてのスペースとタブを削除しました。これは簡単にできます

tr -d " " <file2 > file-b

また、初期値がNAのfile1(現在はfile-aと呼ばれる)に新しいプレースホルダフィールド番号5を追加しました。

これは次の方法で行うことができます。

sed  's/$/\tN.A./' file1 > file-a

したがって、新しい入力ファイルは次のようになります。

$ cat file-a
Tumor_ID, Chromosome, start, end,       N.A.
xxxxx,       2,        12,    13,       N.A.
xxxxx,       3,        45,    46,       N.A.
xxxxx,       3,        48,    49        N.A.
xxxxx,       3,        51,    52,       N.A.
nnnnn,       5,       55,    59,        N.A.
nnnnn,       5,       57,    58,        N.A.
lllll,      11,       13,    14,        N.A.
lllll,      12,        16,    17,       N.A.
eeeee,       2,        51,    52,       N.A.
zzzzz,       9,      1000,   101,       N.A.

$ cat file-b
Patient_No.,Tumor_ID,Normal_ID,
4,xxxxx,hhhhh,
5,nnnnn,aaaaa,
8,lllll,ddddd,
7,eeeee,ggggg,
3,zzzzz,nnnnn,

目標を達成するためのコマンドは次のとおりです。

$ while IFS="," read a b c;do sed -i "/${b}/{s/N.A./${c}/}" file-a;done <file-b

$ cat file-a
Tumor_ID, Chromosome, start, end,       Normal_ID
xxxxx,       2,        12,    13,       hhhhh
xxxxx,       3,        45,    46,       hhhhh
xxxxx,       3,        48,    49        hhhhh
xxxxx,       3,        51,    52,       hhhhh
nnnnn,       5,       55,    59,        aaaaa
nnnnn,       5,       57,    58,        aaaaa
lllll,      11,       13,    14,        ddddd
lllll,      12,        16,    17,       ddddd
eeeee,       2,        51,    52,       ggggg
zzzzz,       9,      1000,   101,       nnnnn

自分に合ったフォーマットを使って出力を美しくすることができます。

答え2

フィールドのスペースと末尾のコンマが質問のタイプミスであると仮定します。もしそうなら実際に部分データを使用してから、以下を使用してクリーンアップします。

mlr -I --csv -N clean-whitespace then remove-empty-columns file1.csv file2.csv

上記のコマンドは以下を使用します。ミラーmlr)は、各フィールド値から先行スペースと末尾スペースを削除し、複数のスペースを単一のスペースに圧縮してから空になる列を削除します。これは「その場で」行われ、元のファイルを上書きします。-I元のファイルを保存するには、このオプションを削除して新しいファイル名にリダイレクトします。

これにより、2つのファイルが作成されますfile1.csv

Tumor_ID,Chromosome,start,end
xxxxx,2,12,13
xxxxx,3,45,46
xxxxx,3,48,49
xxxxx,3,51,52
nnnnn,5,55,59
nnnnn,5,57,58
lllll,11,13,14
lllll,12,16,17
eeeee,2,51,52
zzzzz,9,1000,101

...そしてfile2.csv

Patient_No.,Tumor_ID,Normal_ID
4,xxxxx,hhhhh
5,nnnnn,aaaaa
8,lllll,ddddd
7,eeeee,ggggg
3,zzzzz,nnnnn

Tumor_IDその後、そのフィールドを結合キーとして使用して、それらの間のリレーショナル結合操作を実行できます。

$ mlr --csv join -f file1.csv -j Tumor_ID file2.csv
Tumor_ID,Chromosome,start,end,Patient_No.,Normal_ID
xxxxx,2,12,13,4,hhhhh
xxxxx,3,45,46,4,hhhhh
xxxxx,3,48,49,4,hhhhh
xxxxx,3,51,52,4,hhhhh
nnnnn,5,55,59,5,aaaaa
nnnnn,5,57,58,5,aaaaa
lllll,11,13,14,8,ddddd
lllll,12,16,17,8,ddddd
eeeee,2,51,52,7,ggggg
zzzzz,9,1000,101,3,nnnnn

不要なPatient_No.フィールドの削除は追加の操作で行われます(サブcutコマンド-xのオプションは、cut「名前付きフィールドの削除」を意味します-f)。

$ mlr --csv join -f file1.csv -j Tumor_ID then cut -x -f Patient_No. file2.csv
Tumor_ID,Chromosome,start,end,Normal_ID
xxxxx,3,45,46,hhhhh
xxxxx,3,48,49,hhhhh
xxxxx,3,51,52,hhhhh
nnnnn,5,55,59,aaaaa
nnnnn,5,57,58,aaaaa
lllll,11,13,14,ddddd
lllll,12,16,17,ddddd
eeeee,2,51,52,ggggg
zzzzz,9,1000,101,nnnnn

不要なフィールドを削除したくない場合がありますが、保持したいフィールドと順序を正確に伝えることができます。これは、2番目のファイルにさまざまなフィールドがあり、そこでそのフィールドを使用したい場合にNormal_ID特に便利です。以下のサブコマンド-oのオプションは、cut上記のフィールドを抽出する-fだけでなく、上記の順序で並べ替える必要があることを示します。

mlr --csv join -f file1.csv -j Tumor_ID then cut -o -f Tumor_ID,Chromosome,start,end,Normal_ID file2.csv

関連情報