複数の列に基づいてcsvの2つのファイルを比較し、シェルを使用して最初のファイルの1つの列を2番目のファイルの別の列と一致する値に置き換えます。

複数の列に基づいてcsvの2つのファイルを比較し、シェルを使用して最初のファイルの1つの列を2番目のファイルの別の列と一致する値に置き換えます。

順序が一致しない対応する列に基づいて2つのファイルを比較することに関する質問があります。

ファイル1

AAAA,BBBB,CCCC,DDDD,EEEE,FFFF,GGGG,HHHH (header)
a,b,c,d,e,f,g,h
aa,bb,cc,dd,ee,ff,gg,hh
aaa,bbb,ccc,ddd,eee,fff,ggg,hhh

ファイル2

GGGG,AAAA,CCCC,DDDD,HHHH,EEEE,BBBB,FFFF,IIII (header)
g,a,c,d,h,e,b,f,i
gg,aa,cc,dd,hh,ee,bb,ff,ii

上記の例では、ファイル 1 の 4 つの列とファイル 2 の 4 つの列を比較する必要があります。一致するものが見つかった場合は、ファイル 2 を追加された列と更新し、一致したと言って再利用しません。行を比較して置き換えます。 file1の列とfile2の列

ファイル1とファイル2のaからhまでの6つの列を比較し、一致するものがあればa列をi列に置き換えます。

最終ファイルはファイル3でなければなりません。

AAAA,BBBB,CCCC,DDDD,EEEE,FFFF,GGGG,HHHH
i,b,c,d,e,f,g,h
ii,bb,cc,dd,ee,ff,gg,hh

答え1

使用ミラーmlr)両方のファイルに共通の名前付きフィールドに対してリレーショナルJOIN操作を実行します。

$ mlr --csv join -j AAAA,BBBB,CCCC,DDDD,EEEE,FFFF,GGGG,HHHH -f file1.csv file2.csv
AAAA,BBBB,CCCC,DDDD,EEEE,FFFF,GGGG,HHHH,IIII
a,b,c,d,e,f,g,h,i
aa,bb,cc,dd,ee,ff,gg,hh,ii

AAAA次に、列の内容をの内容に置き換えるには、列を最初に移動し、列を削除してからIIII(ミラー操作で実行)ラベルを再指定できます(ミラー操作で実行)。タスク):IIIIAAAAcutIIIIAAAAlabel

mlr --csv \
    join -j AAAA,BBBB,CCCC,DDDD,EEEE,FFFF,GGGG,HHHH -f file1.csv then \
    cut -o -f IIII,BBBB,CCCC,DDDD,EEEE,FFFF,GGGG,HHHH then \
    label AAAA file2.csv

これcutは2つの別々のステップに分けることができます。 1つはフィールドを除外するステップ、もう1つはフィールドの残りの部分を最初のフィールドにAAAAなるように並べ替えることです。IIIIこれにより、長いフィールドのリストを回避できます。

mlr --csv \
    join -j AAAA,BBBB,CCCC,DDDD,EEEE,FFFF,GGGG,HHHH -f file1.csv then \
    cut -x -f AAAA then \
    reorder -f IIII then \
    label AAAA file2.csv

最終出力:

AAAA,BBBB,CCCC,DDDD,EEEE,FFFF,GGGG,HHHH
i,b,c,d,e,f,g,h
ii,bb,cc,dd,ee,ff,gg,hh

関連情報