2016-09-19 2 views
-1

Ich möchte eine bestimmte Spalte (in diesem Fall Spalte 7) meiner Datei in wissenschaftlicher Notation drucken, während der Rest der Spalten gedruckt wird, wie es ist. Wie kann ich printf selektiv nur für Spalte 7 und nur print für die ersten 6 Spalten verwenden?awk printf eine bestimmte Spalte in einer Datei

Beispiel Eingabe:

C 6 12.011 0.51 3.56E-01 4.60E-01 0.458399 
CA 6 12.011 -0.15 3.55E-01 2.93E-01 0.291708 
CAI 6 12.011 -0.25 3.55E-01 3.05E-01 0.30421 
CC 6 12.011 0.62 3.56E-01 2.93E-01 0.291708 

gewünschte Ausgabe:

C 6 12.011 0.51 3.56E-01 4.60E-01 4.58E-01 
CA 6 12.011 -0.15 3.55E-01 2.93E-01 2.92E-01 
CAI 6 12.011 -0.25 3.55E-01 3.05E-01 3.04E-01 
CC 6 12.011 0.62 3.56E-01 2.93E-01 2.92E-01 
+0

Sind Ihre Spalten mit fester Breite? Ist es immer die letzte Spalte, die Sie ändern möchten? –

+0

awk '{print $ 1, $ 2, $ 3, $ 4, $ 5, $ 6}' input.txt> temp1 awk '{printf "% 4.3e" $ 7}' input.txt> temp2 Ich erhalte Fehler: awk: (FILE-NAME = input.txt FNR = 1) fatal: nicht genügend Argumente Format-String zu erfüllen \t '% 4.3e0.458399' ich dachte, ich Paste wird temp1 temp2> output.txt Allerdings werde ich es vorziehen, wenn ich tun könnte, all dies in einem Schritt/Befehl – ruchi

+0

Nein, es ist nicht immer die letzte Spalte, die ich in wissenschaftliche Notation ändern muss. – ruchi

Antwort

1

können Sie verwenden sprintf:

$ awk -v OFS="\t" '{ $7 = sprintf("%.2E", $7) }1' input.txt 
C 6 12.011 0.51 3.56E-01 4.60E-01 4.58E-01 
CA 6 12.011 -0.15 3.55E-01 2.93E-01 2.92E-01 
CAI 6 12.011 -0.25 3.55E-01 3.05E-01 3.04E-01 
CC 6 12.011 0.62 3.56E-01 2.93E-01 2.92E-01 
+0

oder '{sub ($ 7, sprintf ("% 4.2E ", $ 7))} 1' – karakfa

+1

@karakfa mit' sub' mit einem Feld als Suchmuster scheint nicht eine sehr sichere Option. –

+0

Ja, Sie können Ziel $ 7 zu sub hinzufügen, aber es muss auch neu formatiert werden, also nicht nützlich. – karakfa

0

Um nur die letzte Spalte zu ändern, ohne Abstand von anderen Bereichen zu beeinflussen:

$ cat ip.txt 
C 6 12.011 0.51 3.56E-01 4.60E-01 0.458399 
CA 6 12.011 -0.15 3.55E-01 2.93E-01 0.291708 
CAI 6 12.011 -0.25 3.55E-01 3.05E-01 0.30421 
CC 6 12.011 0.62 3.56E-01 2.93E-01 0.291708 

$ perl -pe 's/\S+$/sprintf "%.2E", $&/e' ip.txt 
C 6 12.011 0.51 3.56E-01 4.60E-01 4.58E-01 
CA 6 12.011 -0.15 3.55E-01 2.93E-01 2.92E-01 
CAI 6 12.011 -0.25 3.55E-01 3.05E-01 3.04E-01 
CC 6 12.011 0.62 3.56E-01 2.93E-01 2.92E-01 

Wenn eine andere Spalte erforderlich ist:

$ perl -pe 's/^(\S+\s+){2}\K\S+/sprintf "%.2E", $&/e' ip.txt 
C 6 1.20E+01 0.51 3.56E-01 4.60E-01 0.458399 
CA 6 1.20E+01 -0.15 3.55E-01 2.93E-01 0.291708 
CAI 6 1.20E+01 -0.25 3.55E-01 3.05E-01 0.30421 
CC 6 1.20E+01 0.62 3.56E-01 2.93E-01 0.291708 
Verwandte Themen