공통 열을 사용하여 파일 병합 싶습니다. 111 x1 a 222 x2

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

파일 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의 첫 번째 열의 하위 집합입니다.



답변

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


답변

결합 사용하기 :

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 명령 맨 페이지를 참조하십시오


답변

약간의 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 – 줄 바꿈


답변

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

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


답변