( 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, awk
ist 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 gsub
Funktion entfernt werden. Das $1=$1
zwingt ihn, den Datensatz mit dem neuen Ausgabefeld-Trennzeichen neu zu kompilieren, das wie ;
im BEGIN-Block definiert wurde. Dann print
wird 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 }'
NF
ist 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=$1
Konstrukt 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 .