2017-09-05 2 views
0

Ich suche nach einer Möglichkeit, eine Spalte in einer Datei zu ersetzen, wenn zwei ID Spalten übereinstimmen. Ich habe Datei A.txtWenn zwei Spalten aus verschiedenen Dateien gleich sind, ersetzen Sie die dritte Spalte durch awk

c a b ID 
1 0.01 5 1 
2 0.1 6 2 
3  2 3 

und B.txt

ID a b 
1 10 15 
2 20 16 
3 30 12 
4 40 14 

Die Ausgabe im für ist Datei A.txt

ID a b 
1 0.01 5 
2 0.1 6 
3 30 2 

ich mit awk welche ID Spalten aus beiden Dateien Spiel finden suchen Datei

awk 'NR==FNR{a[$1];next}$1 in a' B.txt A.txt 

Aber wie man Ersatz anbringt. Vielen Dank für Anregungen.

+0

Gibt es einen Tippfehler in der letzten Zeile des Beispiels A.txt? Es hat nur 2 Spalten. –

+0

@HakanBaba nein ist es nicht, Datei A könnte Zeilen mit weniger Anzahl von Spalten haben – Pooh

+0

@RomanPerekhrest ops, ich kann es auslassen. Entschuldigung – Pooh

Antwort

0

awk Lösung:

awk 'NR==FNR{ if(NR>1) a[$1]=$2; next } 
    FNR>1 && $1 in a && NF<3{ f=$2; $2=a[$1]; $3=f }1' B.txt A.txt | column -t 
  • if(NR>1) a[$1]=$2; - Erfassung Spaltenwerte aus Datei B.txt außer der Kopfzeile (N>1)

  • FNR>1 && $1 in a && NF<3 - wenn ID s Spiel und einige Linie von A.txt hat weniger als 3 Felder


Der Ausgang:

ID a  b 
1 0.01 5 
2 0.1 6 
3 30 2 
+0

danke es funktioniert! – Pooh

+0

@Pooh, du bist willkommen – RomanPerekhrest

+0

Wenn 'ID' Spalte in Datei A nicht zuerst ist, wie soll ich 2 Teil des Codes ändern? – Pooh

0

dokumentiert
awk ' 
    # Load file b reference 
    FNR==NR && NR > 1 {ColB[$1]=$2; next} 

    # treat file A 
    { 
    # set missing field if know in file B (and not 1st line) 
    if (NF < 4 && ($NF in ColB) && FNR > 1) $0 = $NF FS ColB[$NF] FS $2 

    # print result (in any case) 
    print 
    } 

    #order of file is mandatory' B.txt A.txt 

Selbst zu Ihrem neuen Datenformat angepasst. Angenommen, dies ist nur das zweite Feld, das wie in Ihrer Beispiel fehlt

+0

es funktioniert, obwohl es Spalte 'b' nicht gedruckt – Pooh

Verwandte Themen