2016-04-27 9 views
0

Ich habe eine Testdatei, die 4,5 GB ist und ich versuche, es zu formatieren.Verwenden Sie sed, um große Dateien zu formatieren

Zuerst versuche ich, die Registerkarten durch ',' zu ersetzen und auch jedes Spaltenfeld mit einem " zu trennen.

Zweitens formatiere ich ein Datumsfeld in der Datei mit awk und sed. Hier

ist, was ich bin mit:

Für Formatierung:

cat test_sample.csv | sed -e 's/"/""/g' | sed -e 's/\t/","/g' | sed -e 's/$/"/g' | sed -e 's/^/"/' > test_sample.csv 

Für Datum:

awk 'BEGIN{FS=OFS="\",\""} NR>1{cmd = "date -d \"" $10 "\" \"+%Y-%m-%d\"";cmd | getline out; $10=out; close("uuidgen")} 1' test_sample.csv > _report.tmp && mv _report.tmp test_sample.csv 

Diese Befehle fein für kleine Dateien sind runnig aber scheitern und klärt alle die Daten in der Datei.

Kann mir bitte jemand helfen, diese Datei zu formatieren?

+0

Haben (oder können Sie) GNU awk für Zeitfunktionen installieren? –

+0

Sie müssen wahrscheinlich Datum und getline nicht aufrufen und so könnte Ihr Skript um Größenordnungen effizienter sein. Wenn Sie Ihre Frage so bearbeiten, dass sie eine übersichtliche, testbare Eingabe und die erwartete Ausgabe enthält, können wir Ihnen helfen. An dieser Stelle möchten Sie vielleicht eine separate Folgefrage stellen, da Sie bereits eine Antwort auf diese Frage akzeptiert haben. –

Antwort

5

Sie löschen auch kleine Dateien, da die Umleitung zuerst erfolgt, sodass die Datei abgeschnitten wird und leer bleibt.

Bedenken Sie:

$ cat file.txt 
A line of text 
$ cat file.txt > file.txt 
$ cat file.txt  # Empty! 

Um das zu vermeiden, können Sie – in eine temporäre Datei zu kopieren, die die -i Option in sed für Sie tut. Es dauert optional eine Erweiterung:

sed -i.bak '...' 

Dies adressiert Ihr Dateiabschneidungsproblem.

Wie für den Rest:

  • Sie sed oft wie diese nicht nennen:

    sed 's/pattern1/replacement1/' file | sed 's/pattern2/replacement2/' | ... 
    

    Dies gilt für jeden Befehl durch die komplette Datei, um den Prozess zu machen viel langsamer. Verwenden Sie stattdessen:

    sed 's/pattern1/replacement1/;s/pattern2/replacement2/...' 
    

    , um die Datei nur einmal zu verarbeiten.

  • Sie müssen cat nicht verwenden, um in sed zu pipen: sed nimmt einen Dateinamen als Argument und Sie können dies vermeiden Useless Use of cat. Mehr noch, wenn Sie die Befehle kombinieren und alle Pipes vermeiden, siehe unten.
  • Nicht sed und awk kombinieren. Als Faustregel gilt: Wenn Sie awk irgendwo verwenden, brauchen Sie sed nicht.

Eine kombinierte Single-Pass-in-place sed Befehl könnte wie folgt aussehen :

sed -i 's/"/""/g;s/\t/","/g;s/$/"/;s/^/"/' test_sample.csv 

Und alles zu einem einzigen awk reduziert (nicht als Einzeiler freundlich länger, aber auf jeden Fall schneller als sed und awk Kombination):

awk 'BEGIN { OFS="," } 
NR > 1 { 
    gsub(/"/, "\"\"") 
    for (i = 1; i <= NF; ++i) 
     $i = "\"" $i "\"" 
    cmd = "date -d \"" $10 "\" \"+%Y-%m-%d\"" 
    cmd | getline out 
    $10 = out 
    close("uuidgen") 
    print 
}' test_sample.csv > _report.tmp && mv _report.tmp test_sample.csv 

BSD sed wie in Mac OS benötigt -i''.

+0

Während ich mit Ihrer ganzen Antwort einverstanden bin, glaube ich nicht, dass die Ausgabe von sed zu einem anderen einen zu hohen Aufwand verursacht, verglichen mit der Verkettung mit ';'. Da in beiden Fällen sed die Linie zurück in den Musterraum bringt, um sie zu modifizieren. –

+1

@jaypalsingh Es macht einen Unterschied, ob es in jeder Zeile einen Ersatz gibt (kein großer Unterschied zwischen Piping und Verwendung von ';') oder nur sehr wenige in der ganzen Datei (viel Overhead durch mehrfache Verarbeitung der gesamten Datei) Ich würde sagen, dass es Szenarien gibt, in denen sie ähnlich sind, einige, bei denen Piping langsamer ist, aber keine, bei denen Piping schneller ist - warum sollte es nicht zur Gewohnheit werden, immer den potenziell schnelleren zu verwenden? –

+1

Richtig, ich habe nicht vorgeschlagen, Piping wäre schneller, nur war nicht sicher, ob das _slow_ Dinge erheblich sinken könnte. Ich persönlich bevorzuge es, nicht so gut zu pipen, also kann ich mich nicht beschweren. ':)' Alle großen Vorschläge BTW, die die Probleme von OP lösen sollten. –

Verwandte Themen