2012-12-27 11 views
5

Ho un file di testo come questo:awk: Trova e sostituisci in alcuni campo solo

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

Voglio l'uscita per essere come questo:

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

voglio solo sostituire 100 in il campo 3 (una volta 100 è contenuto in $3) in 2000. Come posso realizzare questo lavoro usando awk?

risposta

8

Ecco un modo utilizzando awk:

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

Risultati:

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

Come posso sostituire tutto ciò che non è al 100 con consente di dire 5000 ? – discipulus

+1

@lovedynasty: puoi provare qualcosa come: 'awk '{sub (/ [^ 1] * [^ 0] * [^ 0] * /," 5000 ", $ 3)} 1' file'. Ma questo potrebbe non fornirti i risultati attesi. Di solito quando voglio eseguire una sorta di abbinamento inverso di pattern, vorrei usare una sorta di [asserzione di ricerca] (http://www.regular-expressions.info/lookaround.html). Sfortunatamente, 'awk' non li supporta e avrei bisogno di usare uno strumento più potente. Io userei invece 'perl' in modalità 'auto-split'. HTH. – Steve

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

scusate, non ho descritto correttamente il problema, ho aggiornato il mio problema. –

+0

Come posso sostituire tutto ciò che non è 100 con diciamo 5000? – discipulus

1

Prova:

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