공통 열을 사용하여 두 파일 병합

공통 열을 사용하여 두 파일 병합

2개의 파일이 있습니다.

파일 1은 다음과 같습니다.

burnj01,Joe Burns
steves02,Santosh Steve

파일 2는 다음과 같습니다.

burnj01,0001
burnj01,0002
burnj01,0010
burnj,0100
burnj01,2000
steves02,2048
steves02,2049
steves02,2091

나는 다음과 같은 파일 3을 원합니다 :

burnj01,Joe Burns,0001
burnj01,Joe Burns,0002
burnj01,Joe Burns,0010
burnj01,Joe Burns,0100
burnj01,Joe Burns,2000
steves02,Santosh Steve,2048
steves02,Santosh Steve,2049
steves02,Santosh Steve,2091

첫 번째 파일의 col1을 사용하여 두 파일을 결합하고 일치하면 File2의 열 2 값을 File1의 마지막 열에 추가하고 싶습니다.

나는 이것을 시도했습니다 :

$ awk 'FNR==NR{a[$1]=$2;next} {print $1,$2,a[$1]}' file2 file1 > file3

그러나 이것은 작동하지 않습니다. 어떻게 이를 달성할 수 있나요?

답변1

필드 구분자를 지정 FS하고 OFS이를 출력 필드 구분자로 사용해야 합니다.

awk 'BEGIN        { FS=OFS="," }
     NR==FNR      { saving[$1]=$2; next }
    ($1 in saving){ print $1, saving[$1], $2 }' file1  file2

답변2

코드에는 두 가지 주요 문제 가 있습니다 awk.

  1. awk필드 구분 기호 로 사용하도록 지정하지 않았습니다 ,. 를 사용하여 이 작업을 수행할 수 있습니다 -F ,.
  2. $1키가 배열에 있는지 여부는 테스트하지 않습니다 a. $1 in a마지막 코드 블록 이전의 조건으로 이 작업을 수행 할 수 있습니다 . 두 번째 파일의 모든 이름을 첫 번째 파일에 표시하고 싶지만 이에 대해 아무 말도 하지 않으려면 이 단계를 건너뛸 수 있습니다.

또한 예상 출력과 비교하여 잘못된 순서로 필드를 출력하는 것으로 보이며 쉼표( OFS = ","또는 이 문제를 해결해야 하는 OFS = FS블록 ) 대신 공백인 기본 출력 구분 기호를 사용하고 있습니다.BEGIN

$ awk -F , 'BEGIN { OFS = FS } FNR == NR { names[$1] = $2; next } ($1 in names) { print $1, names[$1], $2 }' file1 file2
burnj01,Joe Burns,0001
burnj01,Joe Burns,0002
burnj01,Joe Burns,0010
burnj01,Joe Burns,2000
steves02,Santosh Steve,2048
steves02,Santosh Steve,2049
steves02,Santosh Steve,2091

$ join -t, <( sort file1 ) <( sort file2 )
burnj01,Joe Burns,0001
burnj01,Joe Burns,0002
burnj01,Joe Burns,0010
burnj01,Joe Burns,2000
steves02,Santosh Steve,2048
steves02,Santosh Steve,2049
steves02,Santosh Steve,2091

이렇게 하면 두 파일이 모두 정렬되고 정렬된 내용이 join유틸리티에 전달됩니다. 이 join유틸리티는 기본적으로 첫 번째 열의 두 데이터세트 간에 관계형 JOIN 작업을 수행합니다. 이는 INNER JOINSQL에 익숙하다면 기본적으로 JOIN입니다. 열이 쉼표로 구분되어 있음을 알리기 위해 -t ,with를 사용합니다 .join

쉘이 <( ... )프로세스 대체를 이해하지 못하는 경우 데이터를 사전 정렬하십시오. 이 join유틸리티에는 정렬된 입력이 필요합니다.

sort -o file1.sorted file1
sort file2 | join -t, file1.sorted -
rm -f file1.sorted

답변3

가입 방법은 다음과 같습니다.

join -t, <(sort file1) <(sort file2)

관련 정보