두 CSV의 열을 비교하고 일치 항목을 병합합니다.

두 CSV의 열을 비교하고 일치 항목을 병합합니다.

두 개의 CSV 파일이 있고 두 번째 파일의 세 번째 열과 일치하는 첫 번째 파일의 첫 번째 열을 기반으로 병합하려고 합니다. 해당 행은 정렬되지 않습니다.

파일 1.csv:

android,1,2
osx,2,5

파일 2.csv:

Converting,:Developer::|[E],android,Exact,,,,8,31
Converting,:Developer::|[E],osx,Exact,,,,8,31
Converting,:Developer::|[E],windows,Exact,,,,8,31

그리고 다음을 얻고 싶습니다출력.csv:

Converting,:Developer::|[E],android,Exact,,,,8,31,1,2
Converting,:Developer::|[E],osx,Exact,,,,8,31,2,5
Converting,:Developer::|[E],windows,Exact,,,,8,31,,

나는 모든 예를 시도했다

awk -F',' 'FNR==NR.....

여기에서 찾을 수 있지만 제대로 찾을 수 없는 것 같습니다.

답변1

join당신은 이것을 사용할 수 있습니다

join -1 1 -2 3 -t ',' -a 2 -o 2.{1..9} 1.{2..3}  <(sort file1.csv) <(sort file2.csv)

-1-2비교하려는 파일의 필드를 지정 하십시오. 일치하지 않는 행을 인쇄하려는
-t필드에 사용할 구분 기호를 지정하십시오 .
-a 2<file2>
-o<file>.<field>

답변2

작업을 위한 최고의 도구아마도join그러나 당신이 언급했기 때문에 awk여기에 또 다른 접근 방식이 있습니다.

$ awk -F',' -vOFS="," 'FNR==NR{a[$1]=$2;b[$1]=$3; next}{print $0,a[$3],b[$3]}' file1 file2
Converting,:Developer::|[E],android,Exact,,,,8,31,1,2
Converting,:Developer::|[E],osx,Exact,,,,8,31,2,5
Converting,:Developer::|[E],windows,Exact,,,,8,31,,

두 개의 배열을 사용 a하고 b첫 번째 필드를 file1키로, 두 번째와 세 번째 필드를 값으로 사용합니다. FNR==NR{...next}첫 번째 파일만 배열에 저장되어 있는지 확인하세요 . 그런 다음 두 번째 파일을 처리하는 동안 파일의 줄( $0)을 인쇄하고 그 뒤에 a배열 sum 의 첫 번째 필드에 해당하는 값을 인쇄합니다 b. -vOFS=","원하는 출력 형식을 얻을 수 있도록 출력 필드 구분 기호를 쉼표로 설정합니다 .

또는 좀 더 신비롭게 말하면:

$ awk -F',' -vOFS="," 'FNR==NR{a[$1]=$2","$3;next}{print $0,(a[$3]?a[$3]:",")}' file1 file2
Converting,:Developer::|[E],android,Exact,,,,8,31,1,2
Converting,:Developer::|[E],osx,Exact,,,,8,31,2,5
Converting,:Developer::|[E],windows,Exact,,,,8,31,,

관련 정보