順序が一致しない対応する列に基づいて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
(ミラー操作で実行)ラベルを再指定できます(ミラー操作で実行)。タスク):IIII
AAAA
cut
IIII
AAAA
label
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