( tr, ';' | tr -d '"' ) < input.csv > output.csv Ich würde Perl verwenden
perl -pe 'tr/,"/;/d' input.csv > output.csv - aber diese spezifische Aufgabe ist nicht mehr als sed. Sie können die beiden Ausdrücke nicht zusammenführen.
Um einige Daten in ein bestimmtes Tool importieren zu können, muss ich eine CSV-Datei aus diesem Format konvertieren
"data","data","data data","data","123" in dieses Format
data;data;data data;data;123 Die Spalten enthalten nie ", ;oder ,aber es können Räume. Zur Zeit verwende ich folgendes
sed -e 's/","/;/g' -e 's/"//g' input.csv > output.csv Obwohl dies gut funktioniert, frage ich mich, ob dies eleganter gemacht werden kann, dh
Danke für deinen Beitrag!
( tr, ';' | tr -d '"' ) < input.csv > output.csv Ich würde Perl verwenden
perl -pe 'tr/,"/;/d' input.csv > output.csv - aber diese spezifische Aufgabe ist nicht mehr als sed. Sie können die beiden Ausdrücke nicht zusammenführen.
Was Sie bevorzugen (perl, sed, awk), liegt bei Ihnen. Sie werden alle die Arbeit erledigen. Da Sie nach Sed gefragt haben und die anderen gepostet werden, geht es los. Dies ist eine einfachere Form Ihrer regulären Ausdrücke und funktioniert mit Ihrer Beispielzeile:
$ sed -e 's/"//g; s/,/;/g' infile.csv > outfile.csv Beachten Sie können die beiden Ausdrücke mit einem Semikolon nach jeder Substitution verbinden. Getestet mit GNU sed v4.1.5.
Hier sind Ihre ursprünglichen Ausdrücke:
$ sed -e 's/","/;/g; s/"//g' infile.csv > outfile.csv Ich bin ziemlich sicher, dass es möglich ist, die beiden Substitutionen zusammenzuführen. Ich bin mir nicht sicher, was es wäre, und ich bin mir ziemlich sicher, dass das Ergebnis viel weniger lesbar sein wird als das Skript an der Spitze. Wenn mir etwas einfällt (oder jemand anderes wiegt in den Kommentaren), füge ich es hier hinzu.
Da Sie mit Datensätzen zu tun haben, awkist es sinnvoller. Das heißt, es ist bei CSV nicht wirklich gut, da die Feldtrenner etwas variabel sind. Wenn Sie jedoch sicher sind, dass alle Felder in doppelte Anführungszeichen gesetzt sind, funktioniert dies:
awk -F'","' 'BEGIN { gsub(/(^")|("$)/, ""); $1=$1; print }' Dies setzt das Eingabefeldtrennzeichen von awk auf " ","" (einschließlich der inneren Anführungszeichen). Dies funktioniert fast, außer dass Sie sich mit den führenden und nachgestellten doppelten Anführungszeichen befassen müssen, die mit der gsubFunktion entfernt werden. Das $1=$1zwingt ihn, den Datensatz mit dem neuen Ausgabefeld-Trennzeichen neu zu kompilieren, das wie ;im BEGIN-Block definiert wurde. Dann printwird der gesamte Datensatz ausgedruckt.
Das ist ein bisschen sauberer:
awk -F '(^")|(",")|("$)' 'BEGIN { $1=$1; print }' Das Eingabefeldtrennzeichen wird auf einen regulären Ausdruck gesetzt, der die doppelten Anführungszeichen am Anfang und am Ende des Datensatzes enthält. Es wird jedoch auch ein leeres Anfangs- und Nachlauffeld ausgegeben. Sie können das nachfolgende Feld leicht loswerden:
awk -F '(^")|(",")|("$)' 'BEGIN { NF=NF-1; $1=$1; print }' NFist die Anzahl der Felder und die Reduzierung um eine Stelle vom letzten Feld. Aber ich kann mir keine Möglichkeit vorstellen, das erste Feld abzuschneiden.
Wenn Sie wissen, dass die Eingabe immer fünf Felder enthält, können Sie Folgendes tun:
awk -F '(^")|(",")|("$)' 'BEGIN { print $2,$3,$4,$5,$6 }' Beachten Sie, dass dadurch das $1=$1Konstrukt entfernt wird, das wir nur brauchen, wenn wir die (implizierten) $ 0 drucken.
Alles in allem würde ich wahrscheinlich Perl und eines der vielen verfügbaren CSV-Module für CPAN verwenden .