Zusammenführen zweier Dateien nach Überprüfung der Übereinstimmung einiger Spalten

Zusammenführen zweier Dateien nach Überprüfung der Übereinstimmung einiger Spalten

Nehmen wir an, ich habe zwei Dateien, 912300001.file1.txt und file2.txt, und diese enthalten Folgendes:

912300001.file1.txt

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

Die erste Spalte ist nicht wichtig, die zweite Spalte ist der Zähler, der in beiden Dateien vorhanden ist. Dies ist eine der Spalten, die ich beim Zusammenführen überprüfen möchte. Die dritte und vierte Spalte sind diejenigen, die ich zusammenführen möchte.

Datei2.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

Ich möchte die dritte Spalte z. B. "912300001" verwenden, um sie mit der Nummer im Namen der ersten Datei zu vergleichen und den Zähler "1000" mit dem Zähler in der ersten Datei. Wenn beide übereinstimmen, möchte ich den Wert aus den Spalten 3 und 4 der ersten Datei in die zweite kopieren, sodass Folgendes passiert:

Ausgabe.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

Wenn möglich, würde ich die Liste der zu prüfenden Dateien auch gerne in einer externen Datei bereitstellen, z. B. „list.txt“.

Danke,


EDIT: Die Lösung wurde von den Reddit-Benutzern commandlineluser und ropid bereitgestellt.FadenDie Lösung lautet wie folgt:

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

Danke,

verwandte Informationen