2017-01-27 3 views
2

Versuchen Sie, einen Wert in einer Reihe von Dateien mit Shell-Befehlen zu ersetzen (um in einem Skript die Dateien in einem Verzeichnis zu durchlaufen).Ersetzen Sie einen Wert nur, wenn größer als

Input file examples: 

file1: 
019=False 
051=Limited 
051>Limited Lease Time=2419200 

file2: 
019=False 
051=Limited 
051>Limited Lease Time=14400 

Das funktionierte in Ordnung:

sed -e '/Limited Lease Time=/s/[0-9]\+$/86400/g' <infile >outfile 

# cat outfile 
019=False 
051=Limited 
051>Limited Lease Time=86400 

Aber ... dann realisiert, dass ich jeden Wert wurde ersetzt, darunter auch solche, niedriger ist als 86400, wenn ich nur etwas mehr als 86400

ersetzen möchten

ich dachte, ich awk verwenden könnte, und diese ‚Art‘ gearbeitet, wie in der Ausgabe nur ‚begrenzte Lease Time‘ war Linien, die einen Wert hat,> 86400:

awk -F= '/Limited Lease Time/ && $2 > 86400 { print $2 }' 

Aber ... es nur ist outputing die abgestimmte Linie, während ich brauche die Originalausgabe (3 Zeilen in den Beispielen), die Änderung einschließlich, wenn der angepassten Wert> 86400

einige Ratschläge auf eine Art und Weise schätzen zu handhaben Dies !

Antwort

5

Verwenden Sie das = Feldtrennzeichen in Awk und bekommen Linien in $2 größer ist als der Wert, den Sie festgelegt haben,

awk 'BEGIN{FS=OFS="="} $0 ~ /\<Limited Lease Time\>/ && $2 > 86400 {$2=86400}1' file 

Für eine Eingabedatei,

cat file 
019=False 
051=Limited 
051>Limited Lease Time=14400 
051>Limited Lease Time=94400 
051>Limited Time=14400 

Ausführen der Befehlsausgabe erzeugt wie du brauchst.

awk 'BEGIN{FS=OFS="="} $0 ~ /\<Limited Lease Time\>/ && $2 > 86400 {$2=86400}1' file 
019=False 
051=Limited 
051>Limited Lease Time=14400 
051>Limited Lease Time=86400 
051>Limited Time=14400 

Auch können Sie es mithilfe der -v Variablen-Import in Awk

awk -v thresh=86400 'BEGIN{FS=OFS="="} $0 ~ /\<Limited Lease Time\>/ && $2 > thresh {$2=thresh}1' file 
+1

Arbeitete groß, dank konfigurierbar machen! Benutzte die awk-Zeile mit dem Variablenimport '-v', um es in meinem Skript sauberer zu machen. Vielen Dank. Gerade jetzt, um die Manpage zu lesen und genau herauszufinden, was es macht ;-) – kpw

Verwandte Themen