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


8

두 가지 파일 중 모든 정보가 포함 된 세 번째 파일을 만들고 싶습니다.

파일 1 :

a 111 
b 222 
c 333 
d 666 
e 777 

파일 2 :

111 x1  
222 x2
333 x3
444 x4 
555 x5 
666 x6 
777 x7 
888 x8

다음과 같이 결합하고 싶습니다.

111  x1  a
222  x2  b
333  x3  c
444  x4  0
555  x5  0
666  x6  d
777  x7  e
888  x8  0

노트 :

파일 1의 두 번째 열은 파일 2의 첫 번째 열의 하위 집합입니다.

답변:


7

join명령은 파일이 당신의 샘플로 분류되어 경우, 필요한 거의 수행합니다

join -12 -a2 file1 file2 -o2.1,2.2,1.1

일치하지 않는 행에 0을 추가하기 만하면됩니다. 이를 위해 -e스위치를 사용할 수 있습니다 .

join -12 -a2 file1 file2  -o2.1,2.2,1.1 -e0

추가 -e0하지 않으면 perl이 필요하지 않습니다 :)
LilloX

@LilloX : 감사합니다. 시도했지만 실패했습니다 (오타).
choroba

13

결합 사용하기 :

join -1 1 -2 2 -a1 -e0 -o'0,1.2,2.1' file2 file1

join 명령은 공통 데이터 필드를 공유하는 두 파일의 행을 결합합니다. 이 경우 : file2의 필드 1 ( -1 1)과 file1의 필드 2 ( )를 사용하여 file2와 -2 2file1을 결합하십시오.

출력 될 것이다 : "필드 접합, 파일 2의 필드 2, 필드 FILE1 1"( -o'0,1.2,2.1'), 누락 필드가 0을 넣어있을 경우 ( -e0)

두 파일 중 하나에 더 많은 레코드가있는 경우 해당 파일을 추가하십시오 (이 경우 file2) ( -a1)

join 명령 맨 페이지를 참조하십시오


좋은. 약간의 설명을 추가해 주시겠습니까?
Lety

물론, 업데이트 :)
LilloX

5

약간의 awk마술 :

awk 'FNR==NR{a[$2]=$1;next}{if(a[$1]==""){a[$1]=0}; \
    printf "%s%s%s%s%s\n",$1,FS,$2,FS,a[$1]}' \
    file1 file2

또는

awk 'FNR==NR{a[$2]=$1;next}{if(a[$1]==""){a[$1]=0};
    print $1,$2,a[$1]}' file1 file2

산출

111 x1 a
222 x2 b
333 x3 c
444 x4 0
555 x5 0
666 x6 d
777 x7 e
888 x8 0

설명

  • FNR==NR{a[$2]=$1;next}

    file1( FNR==NR)를 초과 하여 키-값 구조를 만듭니다. 키는의 두 번째 열 ( $2)이고 file1값은 첫 번째 열 ( $1)입니다.file1

  • {if(a[$1]==""){a[$1]=0};print $1,$2,a[$1]}

    통해 실행 file2

    • if(a[$1]==""){a[$1]=0}

      첫 번째 열에 키 (경우 $1에이) file2에 존재하지 않는 file1, 우리는 필요0

    • print $1,$2,a[$1]

      인쇄 (하여 print제 번째 열) file2과 첫 번째 열의 키 (키와 값 구조 값 $1의)을file2

      또는

    • printf "%s%s%s%s%s\n",$1,FS,$2,FS,a[$1]}'

      printf의 첫 번째 및 두 번째 열과 file2키-값 구조의 값을 첫 번째 열의 키 ( $1)로 인쇄 (사용 )합니다 file2.

      • FS 입력 파일에서 가져온 열 사이의 구분 기호입니다.

      • "%s%s%s%s%s\n"

        출력 형식입니다

        • %s -문자열

        • \n – 줄 바꿈


코드를 설명해 주시겠습니까?
gforce89

물론, 답변이 업데이트되었습니다.
AB

1

q 사용 :

$ q "select f2.c1, f2.c2, ifnull(f1.c1,0) from file_2.txt f2 LEFT JOIN file_1.txt f1 on f1.c2 = f2.c1 "
111 x1 a
222 x2 b
333 x3 c
444 x4 0
555 x5 0
666 x6 d
777 x7 e
888 x8 0

때때로 이런 식으로 더 읽기 쉽습니다.


1
궁금한 사람 q은 패키지 python3-q-text-as-data(Python 3)와 패키지 python-q-text-as-data(Python 2)에 있습니다.
kos December

고맙지 만이 q패키지 는 어디서 구할 수 있습니까? 나도 설치할 수하지 않는 것 python-q-text-as-data또는 python3-q-text-as-data. "E : python3-q-text-as-data 패키지를 찾을 수 없습니다". 내 시스템이 이미 설치되어 python, python2.7, python3,와 python3.4.
Paddy Landau

패키지가 너무 새로워 배포판에서 사용하지 못할 수 있습니다. Github : github.com/harelba/q
Vi를
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.