检查某些列匹配后合并两个文件

检查某些列匹配后合并两个文件

假设我有两个文件 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在此线。解决方法如下:

#!/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

谢谢,

相关内容