Ich habe zwei Dateien, Address.csv und ZipCode.txt. Ich möchte eine Datei generieren, die Address.csv ähnelt, und das Stadtfeld von „Stadt“ auf „gefunden“ aktualisieren, wenn die Postleitzahl mit den ersten 5 Zeichen der Postleitzahl in der Datei Address.csv übereinstimmt.
Was ich habe:
Address.csv
Zip,Address1,Address2,conty,city,state
65432-3421,115 main st,atlantic,city,new jersey
45678-4098,654 2nd st n.,bergin,city,new jersey
23456-3425,4215 1st st. s.,suite a2,camden,city,new jersey
12345-6278,3587 main st,apt j1,essex,city,new jersey
ZipCode.txt
23456
12345
34567
45678
Was ich möchte:
NewAddress.csv
Zip,Address1,Address2,conty,city,state
65432-3421,115 main st,atlantic,city,new jersey
45678-4098,654 2nd st n.,bergin,found,new jersey
23456-3425,4215 1st st. s.,suite a2,camden,found,new jersey
12345-6278,3587 main st,apt j1,essex,found,new jersey
Was ich mit Hilfe von Simlev versucht habeawk ersetzt Feldwert basierend auf übereinstimmendem Wert in einer anderen Datei:
awk -F, -v OFS="," 'NR==FNR {a[$1]++;next} $1 in a {$4="found"} 1' ZipCode.txt Address.csv
Antwort1
Die wichtigste Sache, die in Ihrem Skript geändert werden muss, besteht darin, die ersten 5 Zeichen des ersten Felds mithilfe der Funktion abzurufen substr
.
Die Daten Address.csv
sind inkonsistent. Die ersten beiden Datenzeilen haben 5 Felder, die anderen 6 Felder. Deshalb verwende ich $(NF-1)
(vorletztes Feld) statt $4
(4. Feld). Sonst werden mit deinen Beispieldaten falsche Felder ausgetauscht.
awk -F, -v OFS="," 'NR==FNR {a[$1]++;next} substr($1,1,5) in a {$(NF-1)="found"} 1' ZipCode.txt Address.csv
Dieser Druck
Zip,Address1,Address2,conty,city,state
65432-3421,115 main st,atlantic,city,new jersey
45678-4098,654 2nd st n.,bergin,found,new jersey
23456-3425,4215 1st st. s.,suite a2,camden,found,new jersey
12345-6278,3587 main st,apt j1,essex,found,new jersey