특정 열이 일치하는지 확인한 후 두 파일을 병합합니다.

특정 열이 일치하는지 확인한 후 두 파일을 병합합니다.

다음 내용을 포함하는 두 개의 파일 912300001.file1.txt 및 file2.txt가 있다고 가정해 보겠습니다.

912300001.file1.txt

VALUE   1000    -21 -21
VALUE   1001    -23 -22
VALUE   1002    -23 -21

첫 번째 열은 중요하지 않으며, 두 번째 열은 두 파일 모두에 존재하는 카운터로 병합 시 확인하고 싶은 열 중 하나입니다. 세 번째와 네 번째 열은 병합하려는 열입니다.

파일 2.txt

-123456.12 -1234567.12 912300001     1000 123.1 123.1 ab 1 3
-123466.12 -1234667.12 912300001     1001 133.1 124.1 ab 2 2
-123476.12 -1234767.12 912300001     1002 143.1 125.1 ab 3 1
-123486.12 -1234867.12 922300001     1000 153.1 126.1 ab 3 1
-123496.12 -1234967.12 922300001     1001 163.1 127.1 ab 2 2
-123446.12 -1234367.12 922300001     1002 173.1 128.1 ab 1 3

세 번째 열(예: "912300001")을 사용하여 첫 번째 파일 이름의 숫자와 카운터 "1000"을 첫 번째 파일의 카운터와 비교하고 싶습니다. 두 파일이 모두 일치하는 경우 첫 번째 파일의 열 3과 4 값을 두 번째 파일에 복사하려고 하므로 다음과 같은 일이 발생합니다.

출력.txt

-123456.12 1234567.12 912300001     1000 123.1 123.1 ab 1 3 -21 -21
-123466.12 1234667.12 912300001     1001 133.1 124.1 ab 2 2 -23 -22
-123476.12 1234767.12 912300001     1002 143.1 125.1 ab 3 1 -23 -21
-123486.12 1234867.12 922300001     1000 153.1 126.1 ab 3 1 Values from
-123496.12 1234967.12 922300001     1001 163.1 127.1 ab 2 2 other files
-123446.12 1234367.12 922300001     1002 173.1 128.1 ab 1 3 will come in here

가능하다면 외부 파일(예: "list.txt")에서 확인해야 하는 파일 목록을 제공하고 싶습니다.

감사해요,


편집: 솔루션은 reddit 사용자에 의해 제공되었습니다: commandlineluser 및 ropid here철사. 해결책은 다음과 같습니다.

#!/bin/bash

{
    read -r line
    read -r _ _ prev_name prev_count _ <<< "$line"

    declare -A lookup
    while read -r _ key value
    do
        lookup[$key]=$value
    done < <( sed '$a\' "$prev_name.file1.txt" )

    echo "$line ${lookup[$prev_count]}"

    while read -r line
    do
        read -r _ _ name count _ <<< "$line"
        [[ $name != $prev_name ]] && {
            lookup=()
            while read -r _ key value
            do
                lookup[$key]=$value
            done < "$name.file1.txt"
        }
        prev_name=$name
        prev_count=$count
        echo "$line ${lookup[$prev_count]}"
    done
} < file2.txt

감사해요,

관련 정보