Awk - Werte zwischen zwei Dateien abgleichen
Ich habe zwei Dateien, die ich vergleichen möchte, und erstelle eine final.txt-Datei mit Daten, die aus diesen beiden Dateien vorhanden sind.
Datei1 - Spalte 1 und Datei2 - Spalte 2 enthalten den Wert, den ich zwischen den beiden Dateien abgleichen muss.
Im Wesentlichen versuche ich also, -> Spalte1 aus Datei1 zu übernehmen. Wenn in Spalte2 von Datei2 eine Übereinstimmung vorliegt, schreibe ich File1Column1, File1Column2 und File2Column1 in eine neue Datei mit dem Namen final.txt.
BEISPIEL
Datei 1
1000,Brian
1010,Jason
400,Nick
Datei 2
3044 "1000"
4466 "400"
1206 "1010"
Ausgabedatei aussehen
1000,Brian,3044
1010,Jason,1206
400,Nick,4466
Mein Testcode zeigt kein Ergebnis
awk -F"[,]" 'NR==FNR{a[$1]=$1","$2;next} ($2 in a){print a[$2]","$1}' file1.txt file2.txt
Ich glaube, ich sollte dies mit awk tun können, aber aus irgendeinem Grund habe ich wirklich Probleme mit diesem. Jede Hilfe wäre sehr dankbar.
Vielen Dank
Antworten
Könnten Sie bitte versuchen, mit Ihren gezeigten Beispielen in GNU zu folgen, zu schreiben und zu testen awk
.
awk '
FNR==NR{
gsub(/"/,"",$2) arr[$2]=$1 next } FNR==1{ FS="," OFS="," $0=$0 } ($1 in arr){
print $0,arr[$1]
}
' Input_file2 Input_file1
Erläuterung: Hinzufügen einer detaillierten Erklärung für oben.
awk ' ##Starting awk program from here.
FNR==NR{ ##Checking condition FNR==NR which will be TRUE when Input_file1 is being read.
gsub(/"/,"",$2) ##globally substituting " in 2nd field with NULL. arr[$2]=$1 ##Creating array arr with index of 2nd field and value of 1st field. next ##next will skip all further statements from here. } FNR==1{ ##Checking condition if this is first line of Input_file1. FS="," ##Setting FS as comma here. OFS="," ##Setting OFS as comma here. $0=$0 ##Reassigning current line to itself so that field separator values will be implemented to current line. } ($1 in arr){ ##Checking condition if 1st field is present in arr then do following.
print $0,arr[$1] ##Printing current line and value of array arr.
}
' file2 file1 ##Mentioning Input_file names here.
Sie haben in Ihrer Beispiel-Eingabe / Ausgabe keine Zeilen eingefügt, die nicht zwischen den beiden Eingabedateien übereinstimmen.
$ cat tst.awk BEGIN { FS="[[:space:]\",]+"; OFS="," } NR==FNR { map[$2] = $1 next } { print $0, map[$1] }
$ awk -f tst.awk file2 file1
1000,Brian,3044
1010,Jason,1206
400,Nick,4466