2016-04-10 12 views
2

Ich habe zwei Dateien sagen Datei A und Datei B. Ich möchte die beiden Dateien wie unten gezeigt zusammenführen.Merge zwei Dateien mit Shell-Skripting

Datei A

Data A 
a 123 
b 35 
------- 
Data B 
------- 
Data C 
a 234 
d 23 

Datei B

Data A 
a 12 
c 1 
------- 
Data B 
------- 
Data C  
d 24 

Ausgabe sollte

Data A 
a 135 
b 35 
c 1 
------- 
Data B 
------- 
Data C 
a 234  
d 47 

Daten A, Daten sein ... werden in der gleichen Reihenfolge sein sowohl für die Dateien und Die Variablen unter Daten A, Daten ... werden für beide Dateien alphabetisch sortiert, aber einige Variablen können in einer Datei vorhanden sein oder können nicht.

Ich habe versucht, die beiden Dateien für jeden Block (Trennzeichen als ----) zu verbinden und dann die beiden Zahlen hinzuzufügen, aber ich konnte mir keinen Weg vorstellen, es zu tun.

+0

Wie 'a 135' in der Ausgabedatei kommen? –

+2

@JohnBupit Ich denke, es ist die Summe von 'a' in beiden Eingabedateien. –

Antwort

0

Sollte wahrscheinlich in einigen echten Programmiersprache getan werden, aber Sie eine bash gefragt, so geht es hier:

#!/bin/bash 

declare -A data 

read_sect_from_fd() { 
    local fd=$1 
    while read -u $fd -r var val; do 
     [[ $var == ------- ]] && break 
     if [ "${data[$var]}" ]; then 
      data[$var]=$(($val + ${data[$var]})) 
     else 
      data[$var]=$val 
     fi 
    done <&3 
} 

print_sect() { 
    for i in "${!data[@]}"; do 
     echo "$i ${data[$i]}" 
    done 
} 

exec 3<"File A" 
exec 4<"File B" 

while IFS= read -u 3 -r heading ; do 
    read_sect_from_fd 3 
    IFS= read -u 4 -r heading 
    read_sect_from_fd 4 
    [ "$not_first" ] && echo "-------" 
    not_first=1 
    echo "$heading" 
    print_sect 
    data=() 
done 
+0

Upvote on 'Sollte wohl in einer echten Programmiersprache gemacht werden' – boardrider