2012-12-27 1 views
5

ich eine Textdatei wie diese:awk: finden und in bestimmtem Feld ersetzen nur

$ cat test 
12 13 2100 s 
12 13 3100 s 
100 13 100 s 
12 13 300 s 

ich die Ausgabe will so sein:

$ cat test 
12 13 22000 s 
12 13 32000 s 
100 13 2000 s 
12 13 300 s 

Ich mag nur 100 ersetzen in Feld 3 (einmal 100 ist in $3 enthalten) in 2000. Wie kann ich diesen Job mit awk ausführen?

Antwort

8

Hier ist eine Art und Weise awk mit:

awk '{ sub(/100$/, "2000", $3) }1' file 

Ergebnisse:

12 13 22000 s 
12 13 32000 s 
100 13 2000 s 
12 13 300 s 
+0

Wie kann ich alles ersetzen, die nicht 100 ist mit 5000 können sagen, ? – discipulus

+1

@lovedynast: Sie könnten etwas versuchen wie: 'awk '{sub (/ [^ 1] * [^ 0] * [^ 0] * /," 5000 ", $ 3)} 1' Datei '. Aber das liefert möglicherweise nicht die erwarteten Ergebnisse. Normalerweise, wenn ich eine Art inversen Mustervergleich durchführen möchte, möchte ich eine Art [Look-Around-Assertion] verwenden (http://www.regular-expressions.info/lookaround.html). Leider unterstützt 'awk' diese nicht und ich müsste ein leistungsfähigeres Werkzeug verwenden. Ich würde stattdessen "Perl" im "Auto-Split" -Modus verwenden. HTH. – Steve

1
awk '$3~/100/{gsub(/100/,"2000",$3)}1' your_file 
+0

Sorry, ich habe das Problem nicht richtig beschrieben, ich habe mein Problem aktualisiert. –

+0

Wie kann ich alles ersetzen, was nicht 100 ist, sagen wir 5000? – discipulus

1

Versuchen:

awk '{$3=gensub(100,2000,1,$3);print}' test.txt