Unterstrich durch Komma ersetzen und doppelte Anführungszeichen in CSV entfernen

10

Ich habe eine CSV-Datei als

input.csv

"1_1_0_0_76"
"1_1_0_0_77"
"1_1_0_0_78"
"1_1_0_0_79"
"1_1_0_0_80"
"1_1_0_0_81"
"1_1_0_0_82"
"1_1_0_0_83"
"1_1_0_0_84"
"1_1_0_0_85"

............. und so weiter.

Ich muss diese CSV-Datei in konvertieren

result.csv 

1,1,0,0,76
1,1,0,0,77
1,1,0,0,78
1,1,0,0,79
1,1,0,0,80
1,1,0,0,81
1,1,0,0,82
1,1,0,0,83
1,1,0,0,84
1,1,0,0,85
RKR
quelle

Antworten:

24

Weitaus einfacher ist die Verwendung tr

$ tr '_' ',' < input.csv | tr -d '"'                  
1,1,0,0,76
1,1,0,0,77
1,1,0,0,78

Dies funktioniert so, dass trzwei Argumente erforderlich sind - der zu ersetzende Zeichensatz und deren Ersetzung. In diesem Fall haben wir nur Sätze von 1 Zeichen. Wir leiten den stdin-Stream der input.csvEingabe trüber den <Shell-Operator um und leiten die resultierende Ausgabe weiter tr -d '"', um doppelte Anführungszeichen zu löschen.

Aber awkkann es auch tun.

$ cat input.csv
"1_1_0_0_76"
"1_1_0_0_77"
"1_1_0_0_78"
$ awk '{gsub(/_/,",");gsub(/\"/,"")};1' input.csv
1,1,0,0,76
1,1,0,0,77
1,1,0,0,78

Die Funktionsweise ist etwas anders: awk liest jede Datei Zeile für Zeile, wobei jedes Inline-Skript verwendet wird /Pattern match/{ codeblock}/Another pattern/{code block for this pattern}. Hier haben wir kein Muster, also bedeutet es, Codeblock für jede Zeile auszuführen. gsub()Die Funktion wird für die globale Ersetzung innerhalb einer Zeile verwendet. Daher ersetzen wir damit Unterstriche durch Kommas und doppelte Anführungszeichen durch eine Nullzeichenfolge (wodurch das Zeichen effektiv gelöscht wird). Das 1ist anstelle der Musterübereinstimmung mit dem fehlenden Codeblock, der standardmäßig einfach die Zeile druckt; Mit anderen Worten, der Codeblock mit gsub()erledigt den Job und 1druckt das Ergebnis.

Verwenden Sie die Shell-Umleitung ( >), um die Ausgabe an eine neue Datei zu senden:

 awk '{gsub(/_/,",");gsub(/\"/,"")};1' input.csv > output.csv
Sergiy Kolodyazhnyy
quelle
Entschuldigung. Ich wollte auch die Anführungszeichen entfernen. Ich habe die Frage aktualisiert
RKR
@RKR Antwort entsprechend aktualisiert, Ians Antwort wird ebenfalls aktualisiert
Sergiy Kolodyazhnyy
13

Alternativ können Sie auch diesen sedBefehl verwenden:

$ sed -e 's/_/,/g' -e 's/"//g' input.csv
1,1,0,0,76
1,1,0,0,77
1,1,0,0,78
IanC
quelle
1
Bei einfachen Anführungszeichen müssen Sie sich keinem doppelten Anführungszeichen entziehen.
Glenn Jackman
In der Tat @glennjackman! Ich habe gerade den entkommenden Backslash entfernt
IanC
10

Perl, die "Schweizer Kettensäge" der Kommandozeilen-Textverarbeitung, kann dies ebenfalls. Die Syntax ist (nicht zufällig) der trund sed-Beispiele ziemlich ähnlich :

perl -pe 'tr/_"/,/d' input.csv > result.csv

oder:

perl -pe 's/_/,/g; s/"//g' input.csv > result.csv

Aber ehrlich gesagt, wenn Sie sich nicht die Zeit nehmen möchten, eine neue Programmiersprache zu lernen (was wirklich awk, Perl und sed und andere Tools wie diese sind), nur für diese grundlegende Aufgabe, können Sie dies genauso gut tun Jeder Texteditor, der das Suchen und Ersetzen unterstützt:

  1. Öffnen Sie die CSV-Datei in Ihrem bevorzugten Texteditor (z. B. gedit, kate, mousepad usw .; dies kann auch mit einem einfachen alten Editor oder Wordpad unter Windows geschehen).

  2. Wählen Sie "Suchen und Ersetzen" aus dem Menü (normalerweise unter "Bearbeiten", wenn es kein separates "Suchen" -Menü gibt).

  3. Geben Sie _in das Suchfeld und ,in das Ersatzfeld ein.

  4. Klicken Sie auf "Alle ersetzen".

  5. Wiederholen Sie mit "im Suchfeld und nichts im Ersatzfeld.

  6. Speicher die Datei.

Wenn Sie dies für 100 oder 1000 Dateien anstatt nur für eine tun müssen, ist das Erlernen eines neuen Befehlszeilentools sinnvoll. Und wenn Sie erst einmal wissen, wie man Perl oder sed oder was auch immer verwendet, sparen Sie später viel Zeit und Mühe mit ähnlichen Aufgaben. Aber für nur einen einmaligen Job, von dem Sie nicht erwarten, dass er erneut ausgeführt werden muss, ist manchmal ein einfaches interaktives Tool wie ein Texteditor die einfachste Lösung.

Ilmari Karonen
quelle
3

Sie könnten dies auch mit tun vim.

Öffnen Sie die Datei: vim input.csvund verwenden Sie vimdas erweiterte Suchwerkzeug s. Geben Sie Doppelpunkt ( :) ein, um in den Befehlsmodus zu gelangen, und führen Sie folgende Befehle aus:

:%s's/_/,/g'  -- Replaces all occurrences of _ with , in the current file.
:s/\"//g -- Replaces all occurrences of " with nothing in the current file.

Ziemlich die gleichen Befehle wie in IanCs Antwort, aber innerhalb von vimanstatt zu verwenden sed.

Fragezeichen
quelle
2

Warum nicht einfach die Standardwerte der Separatorwerte für Eingabe und Ausgabe ändern?

awk -F "_" 'BEGIN { OFS="," }; {gsub(/\"/,""); print $1,$2,$3,$4,$5}' input.csv
Antuan sehikyan
quelle