
Ich habe zwei Dateien:
Datei 1
hc Value
cluster0 0.1
cluster0 0.2
cluster0 0.3
cluster1 0.3
cluster1 0.5
cluster0 0.8
cluster2 0.9
cluster2 0.9
cluster0 0.0
Datei 2
hc mean
cluster0 0.35
cluster1 0.4
cluster2 0.9
Und ich möchte eine neue Tabelle wie folgt erstellen:
Datei 3
hc Value mean
cluster0 0.1 0.35
cluster0 0.2 0.35
cluster0 0.3 0.35
cluster1 0.3 0.40
cluster1 0.5 0.40
cluster0 0.8 0.35
cluster2 0.9 0.90
cluster2 0.9 0.90
cluster0 0.0 0.35
Wie kann ich dies in Bash tun? Gibt es einen Befehl, mit dem dies problemlos möglich ist?
Antwort1
Dies lässt sich ganz einfach in Awk erledigen:
$ awk 'NR==FNR {a[$1] = FNR==1 ? $2 : sprintf("%.2f",$2); next} {print $0,a[$1]}' File2 File1
hc Value mean
cluster0 0.1 0.35
cluster0 0.2 0.35
cluster0 0.3 0.35
cluster1 0.3 0.40
cluster1 0.5 0.40
cluster0 0.8 0.35
cluster2 0.9 0.90
cluster2 0.9 0.90
cluster0 0.0 0.35
Die Schritte sind:
Erstellen Sie für die Zeilen in der ersten benannten Datei (
NR==FNR
) ein assoziatives Array (oder Hash), das nach den Werten der ersten Spalte indiziert ist und die Werte der zweiten Spalte (Mittelwert) enthält. Wenn die Mittelwerte nicht im Fließkommaformat angezeigt werden müssen, können Sie diesen Schritt vereinfachen, indem SieNR==FNR {a[$1] = $2}
alle Werte (einschließlich der Kopfzeile) als Zeichenfolgen behandeln.Andernfalls drucken Sie die Zeile, gefolgt vom Wert im Array, dessen Index mit der ersten Spalte übereinstimmt
Antwort2
Habe es mit dem folgenden Skript versucht und es hat auch gut funktioniert
Befehl
for i in `cat file2| awk '{print $1}'`; do p=`grep "$i" file2| awk '{print $2}'`; awk -v i="$i" -v p="$p" '$1 == i {$3=p;print $0}' file1; done|sed '1i hc Value mean'
Ausgabe
hc Value mean
cluster0 0.1 0.35
cluster0 0.2 0.35
cluster0 0.3 0.35
cluster1 0.3 0.40
cluster1 0.5 0.40
cluster0 0.8 0.35
cluster2 0.9 0.90
cluster2 0.9 0.90
cluster0 0.0 0.35