Eine CSV-Datei wie diese haben:
HEADER
"first, column"|"second "some random quotes" column"|"third ol' column"
FOOTER
und auf der Suche nach Ergebnis wie:
HEADER
first, column|second "some random quotes" column|third ol' column
mit anderen Worten: Entfernen von "FOOTER", Anführungszeichen am Anfang, Ende und um |.
Bisher funktioniert dieser Code:
sed '/FOOTER/d' csv > csv1 | #remove FOOTER
sed 's/^\"//' csv1 > csv2 | #remove quote at the beginning
sed 's/\"$//' csv2 > csv3 | #remove quote at the end
sed 's/\"|\"/|/g' csv3 > csv4 #remove quotes around pipe
Wie Sie sehen, werden 4 zusätzliche Dateien erstellt.
Hier ist eine andere Lösung, die das Ziel hat, keine zusätzlichen Dateien zu erstellen und dasselbe in einem einzigen Skript zu tun. Das funktioniert nicht sehr gut.
#!/bin/ksh
sed '/begin/, /end/ {
/FOOTER/d
s/^\"//
s/\"$//
s/\"|\"/|/g
}' csv > csv4
sed
wirst damit nicht arbeiten, nur mit vereinfachtem csv. Verwenden Sie eine Programmiersprache mit einer Bibliothek, die echte CSV-Dateien verarbeiten kann (Python / Perl / Ruby).Antworten:
Erstens, wie Michael gezeigt hat, können Sie all diese Befehle einfach zu einem einzigen Befehl kombinieren:
Ich denke, einige
sed
Implementierungen kommen damit nicht klar und benötigen möglicherweise:Das heißt, es sieht so aus, als wären Ihre Felder durch definiert,
|
und Sie möchten nur"
das gesamte Feld entfernen und die Felder im Feld belassen. In diesem Fall können Sie Folgendes tun:Oder mit GNU
sed
:Sie könnten auch Perl verwenden:
quelle
Das würde auch funktionieren:
sed 's / ^ "//; s /" | "/ | / g; s /" "$ /" /'
Beispiel:
hübsche Version
quelle
FOOTER
, werden die gewünschten Daten entfernt.