
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,