순서가 맞지 않는 해당 열을 기반으로 두 파일을 비교하는 것에 대한 질문이 있습니다.
파일 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
작업은 두 가지 개별 단계로 나눌 수 있습니다. 하나는 필드를 제외하는 단계 이고 다른 하나는 나머지 필드를 첫 번째 필드가 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