두 번째 열을 기준으로 숫자로 정렬된 두 파일 결합

두 번째 열을 기준으로 숫자로 정렬된 두 파일 결합

파일이 두 개 있어요

파일 1에는 다음이 포함됩니다.

2*J=0 EXP= 0.00000
2*J=4 EXP= 1.27911
2*J=8 EXP= 1.57613
2*J=12 EXP= 1.69134
2*J=10 EXP= 2.72705
2*J=16 EXP= 4.55689
2*J=20 EXP= 5.62138

파일 2에는 다음이 포함됩니다.

2*J=0 EXC= 0.00000
2*J=8 EXC= 1.21836
2*J=4 EXC= 1.59642
2*J=12 EXC= 1.78359
2*J=10 EXC= 2.69484
2*J=16 EXC= 7.24518
2*J=20 EXC= 7.32688

이 두 파일을 결합하여 출력이 다음과 같도록 하고 싶습니다.

2*J=0 EXP= 0.00000 EXC= 0.00000
2*J=4 EXP= 1.27911 EXC= 1.59642
2*J=8 EXP= 1.57613 EXC= 1.21836
2*J=12 EXP= 1.69134 EXC= 1.78359
2*J=10 EXP= 2.72705 EXC= 2.69484
2*J=16 EXP= 4.55689 EXC= 7.24518
2*J=20 EXP= 5.62138 EXC= 7.32688

답변1

GNU awk를 사용하면 출력 정렬 방법을 제어할 수 있습니다.

소목 .awk

#!/usr/bin/env -S gawk -f

FILENAME == ARGV[1] {
    f1[$1] = $2 OFS $3
    sort_key[$1] = $3
    next
}

{
    f2[$1] = $2 OFS $3
}

function sorter(idx1, val1, idx2, val2) {
    return sort_key[idx1] - sort_key[idx2]
}

END {
    PROCINFO["sorted_in"] = "sorter"
    for (key in f1)
        print key, f1[key], f2[key]
}

그 다음에

$ gawk -f joiner.awk file1 file2
2*J=0 EXP= 0.00000 EXC= 0.00000
2*J=4 EXP= 1.27911 EXC= 1.59642
2*J=8 EXP= 1.57613 EXC= 1.21836
2*J=12 EXP= 1.69134 EXC= 1.78359
2*J=10 EXP= 2.72705 EXC= 2.69484
2*J=16 EXP= 4.55689 EXC= 7.24518
2*J=20 EXP= 5.62138 EXC= 7.32688

"PROCINFO" 매직이 문서화되어 있습니다:https://www.gnu.org/software/gawk/manual/html_node/Controlling-Array-Traversal.html

답변2

의 경우 join입력은 조인 키에 따라 어휘적으로 정렬되어야 합니다. 다른 방법으로 결과를 정렬해야 하는 경우에는 참가한 후에 수행해야 합니다.

$ join <(sort -bk1,1 file1) <(sort -bk1,1 file2) | sort -k3n
2*J=0 EXP= 0.00000 EXC= 0.00000
2*J=4 EXP= 1.27911 EXC= 1.59642
2*J=8 EXP= 1.57613 EXC= 1.21836
2*J=12 EXP= 1.69134 EXC= 1.78359
2*J=10 EXP= 2.72705 EXC= 2.69484
2*J=16 EXP= 4.55689 EXC= 7.24518
2*J=20 EXP= 5.62138 EXC= 7.32688

sort -k3n세 번째 필드로 시작하는 행 부분을 숫자로 정렬합니다. 기본적으로 필드는 공백이 아닌 필드에서 공백으로의 변환으로 구분되므로 정렬 키에는 선행 공백과 숫자 뒤에 오는 내용이 포함되지만 필드를 해석할 때는 둘 다 숫자로 무시됩니다. 공백으로 구분된 세 번째 필드를 지정하는 더 정확한 방법은 공백을 제거하고 sort -bk3,3n선택 하는 것입니다.-b3,3오직세 번째 필드는 실제로 기능적 차이가 없습니다.

프로세스 교체( <(...))는 Korn 쉘 확장입니다. in zshbash케이스 로 도 사용 가능합니다 .

sort -bk1,1join공백으로 구분된 첫 번째 필드를 기준으로 어휘적으로 정렬합니다(기본적으로 키 연결).

관련 정보