첫 번째 열을 기반으로 한 번에 여러 파일을 결합하는 해결 방법이 있습니까? 보통 저는 이렇게 합니다:
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
문제가 발생하는 경우가 많습니다.