2016-12-05 3 views
1

Ich habe eine Textdatei mit dem nächsten Format:Ändern von Spalten nach einer Linie Flagge oder Marker mit Bash oder Awk oder Gawk?

# 100 104 0.0 
LAFE 0.3831 0.9920 P 
MURC -33.1608 0.9966 P 
POPE -5.4608 0.3327 P 
# 100 105 0.0 
LAFE -53.6463 0.9912 P 
MURC -48.3792 0.9988 P 
NARJ -51.5767 0.3749 P 
# 100 106 0.0 
LAFE -51.8675 0.9882 P 
MURC -48.2517 0.9986 P 
SAJU -49.1528 0.3051 P 
# 100 107 0.0 

ich brauche die zweite Spalte multipliziert mit 0,01 zu modifizieren aber ich brauche Linien zu halten mit ‚#‘ intakt, so dass die zweite der Linie mit # doesn ändere nicht.

Irgendwelche Ideen, wie man das in awk oder bash macht?

Vielen Dank.

Antwort

3

mit awk:

awk '$1!="#" {$2 *= 0.1} 1' file.txt 

wenn erstem Feld nicht # ist, multiplizieren zweites Feld von 0,1. Alle Zeilen drucken

Ergebnis auf Ihrem bereitgestellt Dataset:

# 100 104 0.0 
LAFE 0.03831 0.9920 P 
MURC -3.31608 0.9966 P 
POPE -0.54608 0.3327 P 
# 100 105 0.0 
LAFE -5.36463 0.9912 P 
MURC -4.83792 0.9988 P 
NARJ -5.15767 0.3749 P 
# 100 106 0.0 
LAFE -5.18675 0.9882 P 
MURC -4.82517 0.9986 P 
SAJU -4.91528 0.3051 P 
# 100 107 0.0 

beiseite, wenn es ein Risiko, dass die # nicht allein auf dem ersten Feld zu sein, müssen Sie mit einem regulären Ausdruck überprüfen, wie Ed bemerkte:

awk '$1 !~ /^#/ {$2 *= 0.1} 1' file.txt 
+0

Jean-Francois, Vielen Dank Bruder !! –

+0

Das Skript sollte mit '1' enden, nicht mit' $ 0'. Erstere wird alle Zeilen drucken, letztere werden nur Zeilen drucken, die nicht leer sind oder deren Inhalt numerisch auf ungleich Null ausgewertet wird. Mit dieser speziellen Eingabedatei erhalten Sie die gleiche Ausgabe, aber es ist eine schlechte Angewohnheit. Beachten Sie auch, dass dies abhängig vom Leerzeichen ist, da nach dem '#' ein Leerzeichen steht, um es als '$ 1' zu identifizieren. Teste für '$ 1! ~/^ # /' Anstelle von '$ 1! =" # "'. –

+1

Ed, danke für diese Beobachtung. Wird deine Eingabe einbeziehen. –

Verwandte Themen