조인을 사용하여 여러 파일 병합

조인을 사용하여 여러 파일 병합

첫 번째 열을 기반으로 한 번에 여러 파일을 결합하는 해결 방법이 있습니까? 보통 저는 이렇게 합니다: join File1 File2 > File1+File2그리고File1+File2 File3 > final_output

예시 파일:

파일 1:

1 test1
2 test3
3 test4
4 test5
7 test7

파일 2:

1 example1
2 example2
3 example3
4 example4
8 example8

파일 3:

1 foo1
2 foo2
3 foo3
4 foo4
10 foo10

다섯 번째 줄은 파일마다 다를 수 있고 n파일 수가 많다는 점을 고려하세요. 편집하다:

출력 예:

1 test1 example1 foo1
2 test2 example2 foo2
3 test3 example3 foo3
4 test4 example4 foo4

반면에 1열(5행)의 일치하지 않는 행을 어떻게 처리해야 할지 잘 모르겠습니다. 감사합니다.

답변1

기본적으로 3개 파일 예제와 같습니다.

$ join file2 file3| join file1 -
1 test1 example1 foo1
2 test3 example2 foo2
3 test4 example3 foo3
4 test5 example4 foo4

하지만 중요한 것은모든 입력 파일은 이미 정렬되어 있어야 합니다( sort -k 1b,1예제와 같은 숫자 정렬은 작동하지 않을 수 있습니다!). 따라서 위의 동적 정렬 예제는 bash다음과 같이 작성할 수 있습니다.

join <(sort -k 1b,1 file2) <(sort -k 1b,1 file3) | join <(sort -k 1b,1 file1) -\
  | sort -k 1n,1

마지막으로 재귀 함수를 사용하는 n개 파일의 일반적인 경우입니다(에서 테스트됨 bash).

xjoin() {
    local f
    local srt="sort -k 1b,1"

    if [ "$#" -lt 2 ]; then
            echo "xjoin: need at least 2 files" >&2
            return 1
    elif [ "$#" -lt 3 ]; then
            join <($srt "$1") <($srt "$2")
    else
            f=$1
            shift
            join <($srt "$f") <(xjoin "$@")
    fi
}

xjoin file1 file2 file3 | sort -k 1n,1

수행 중인 작업을 알고 있다면 정렬 파이프라인을 생략할 수 있습니다. 하지만 내 경험상 join이에 대해 명확하지 않으면 sort문제가 발생하는 경우가 많습니다.

관련 정보