2016-06-30 5 views
0

Ich möchte awk verwenden, um eine CSV-Datei mit verschiedenen Arten von Werten zu bearbeiten, zum Beispiel um alle Werte mehrerer unterschiedlicher Spalten auf die zweite Dezimalstelle. Die anderen Zeilen können ebenfalls Gleitkommawerte enthalten, aber diese müssen auf andere Weise behandelt werden.So verwenden Sie awk, um mehrere Spalten der CSV-Datei zu bearbeiten

Angenommen, eine Zeile sieht wie die folgende aus, und ich würde gerne die 7., 8. und 9. Spalte bearbeiten (tatsächlich sind sie viel länger, aber alle relevanten Arten von Werten sind in diesem Beispiel, also ist es nur eine Frage of scale):

L ,P_005 ,250.092 ,20.0 ,-0.80 ,0.803443 ,0.23342 ,0.83728329 ,0.0 ,0.0 

sollte die Ausgabe sein

L ,P_005 , 250.092, 20.0, -0.80, 0.80, 0.23, 0.84, 0.0, E2=0.0 

bis jetzt habe ich immer um den Wert einer Spalte "x" mit:

#/bin/sh 
OLDIFS=$IFS 
IFS = "," 
file=$1 
... 
awk '{printf "%.2f",$x}' $1 
... 
IFS=$OLDIFS 

So wie anzupassen ich dieses Konzept in einer Art und Weise, wo ich kann

  • bearbeiten mehrere Spalten und
  • Display die gesamte CSV-Datei

ohne jede Spalte mit einer bestimmten Option Aufschreiben ?

+3

[Bearbeiten] Ihre Frage enthält eine [mcve] einschließlich prägnanter, testbarer Beispieleingabe und erwarteter Ausgabe. Verwenden Sie die '{}' Editor-Schaltfläche für Ihr Skript, Eingabe und Ausgabe. Was Sie als das Skript gezeigt haben, das Sie gerade verwenden, ist keine gültige awk-Syntax - bitte zeigen Sie uns nichts und sagen Sie uns, dass es etwas anderes ist, das Ihre Frage nur verschleiert und es uns schwerer macht, Ihnen zu helfen. –

+0

Vielen Dank für den Hinweis. Ich hoffe, dass meine Änderungen den Anforderungen entsprechen – krouch

+0

Wenn Sie 1 Zeile Beispiel Eingabe/Ausgabe veröffentlichen, erhalten Sie wahrscheinlich eine Lösung, die nur für diese 1 Zeile der Eingabe funktioniert. Je mehr Aufwand Sie in Ihre Frage stellen (z. B. jeden regnerischen Tag und/oder Randfälle, die Sie sich bei Ihrer Eingabe vorstellen könnten), desto wahrscheinlicher ist es, dass Sie eine robuste Lösung erhalten. –

Antwort

1

Wenn ich Ihre guestion richtig verstanden habe:

awk -F\; -v OFS=\; ' 
function foo(str) { 
    if(match(str, /[0-9]+\.[0-9]+/, arr)) { 
    gsub(/[0-9]+\.[0-9]+/, sprintf("%.2f",arr[0]), str) 
    } 
    return str 
} 
{ 
    for(i=1; i<=NF; i++) 
    printf "%s%s", foo($i),(i<NF?OFS:ORS) 
}' test.in 

Es produziert:

L;P_005;X 250; Y 20; Z 0; A 0.80; B 0.23; C 0.84; E1=0.00; E2=0.00 , 

.

+0

Wenn Sie in der Regex '+' in '{2,}' ändern, erhalten Sie das gewünschte Ausgabeformat 'L; P_005; X 250; Y 20; Z 0; A 0.803443; B 0,23342; C 0,83728329; E1 = 0,0; E2 = 0.0, ' – karakfa

+0

Sie sollten erwähnen, dass das nur für GNU awk aufgrund des 3. Arguments für match() funktioniert. Noch wichtiger ist, dass dies ein gutes Beispiel für ein Skript ist, das für die Posted-Sample-Eingabe funktioniert, aber für andere potenzielle Eingaben fehlschlägt. Versuchen Sie zum Beispiel 'P_005' in' P_00.5' zu ändern und Sie werden feststellen, dass es als 'P_0.50' ausgegeben wird. –

Verwandte Themen