![두 CSV의 열을 비교하고 일치 항목을 병합합니다.](https://linux55.com/image/82650/%EB%91%90%20CSV%EC%9D%98%20%EC%97%B4%EC%9D%84%20%EB%B9%84%EA%B5%90%ED%95%98%EA%B3%A0%20%EC%9D%BC%EC%B9%98%20%ED%95%AD%EB%AA%A9%EC%9D%84%20%EB%B3%91%ED%95%A9%ED%95%A9%EB%8B%88%EB%8B%A4..png)
두 개의 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,,