Ich arbeite mit der .csv
Ausgabe dieser SE-Datenabfrage, die so aussieht (nur mit 5022 Einträgen):
"{
""id"": 281952,
""title"": ""Flash 11.2 No Longer Supported by Google Play""
}"
"{
""id"": 281993,
""title"": ""Netbeans won't open in Ubuntu""
}"
(Und es hat Zeilenenden ^M
zwischen [Nummer] und "" Titel ""). Ich brauche es, um so auszusehen:
281952,Flash 11.2 No Longer Supported by Google Play
281993,Netbeans won't open in Ubuntu
Ich habe dies in einem bestimmten Texteditor behoben, der recht einfach namenlos bleiben soll, aber ich wollte ein Skript erstellen, damit ich es nicht jedes Mal erneut ausführen muss, wenn die Abfrage aktualisiert wird und andere es verwenden können. Ich habe sed
...
Diese Befehlsreihe funktioniert einwandfrei (obwohl sie möglicherweise ineffizient ist; es handelt sich lediglich um eine Trial-and-Error-Lösung):
# Print the ^M and remove them, write to a new file:
cat -v QueryR* | sed 's/\^M//' > QueryNew
# remove all the other junk:
sed -i 's/{//' QueryNew
sed -i 's/}//' QueryNew
sed -i 's/""//g' QueryNew
sed -i 's/^"//' QueryNew
sed -i '/,/{N;/\n.*title:\s/{s/,\n.*title:\s/,\ /}}' QueryNew
sed -i 's/^\s\+//' QueryNew
sed -i '/^\s*$/d' QueryNew
sed -i 's/^id:\ //' QueryNew
sed -i 's/,\ /,/' QueryNew
sed -i 's/\\//g' QueryNew
Warum nicht? Nur das ^M
und wird {}
entfernt, und alles andere ist noch da.
#!/bin/bash
cat -v QueryR* | sed 's/\^M//' > QueryNew
sed -i '{
s/{//
s/}//
s/""//g
s/^"//
/,/{N;/\n.*title:\s/{s/,\n.*title:\s/,\ /}}
s/^\s\+//
/^\s*$/d
s/^id:\ //
s/,\ /,/
s/\\//g
}' QueryNew
Ich bin sicher, mein Fehler ist wirklich offensichtlich ...
quelle
\r
.jq
brach in der ersten Zeile, in der das Titelfeld einen Doppelpunkt hatte (die erste Zeile). Ich binsed
mir immer noch nicht sicher, warum ich mich hasse, aber ich habe einige der Zitate und\r
in dieser Zeile getötet/,\r*/{N;/\n.*title.*:\s/{s/,\r*\n.*title.*:\s/,\ /}}
und schließlich funktioniert es so . Vielen Dank ^ _ ^sed -rn -e 's/\"\"//g' -e 's/^(.*): (.*)\r$/\2/p' QueryR* | paste -d '' - -
und wie von Zauberhand gemacht)Ich habe es dank Stahlfluss und weiterem Basteln behoben. Unraffiniert funktioniert aber.
Übersetzung:
s/"{//
Entfernen"{
s/}"//
Entfernen}"
s/^"//
Entfernen"
vom Anfang der Zeile/,\r/{N;/\n.*title.*:\s/{s/,\r\n.*title.*:\s/,\ /}}
Übereinstimmung,\r
in einer Zeile und[whatever]title[whatever]:
in der nächsten Zeile Ersetzen Sie alles durch,
s/""//g
Entfernen Sie alle verbleibenden doppelten doppelten Anführungszeichen.s/^\s\+//
Entfernen Sie Leerzeichen vom Zeilenanfang./^\s*$/d
Entfernen Sie leere Zeilen.s/^id:\ //
Entfernen Sieid:
und setzen Sie ein Leerzeichen danach.s/\\//g
Entfernen Sie Backslashes (Escape-Zeichen für "zu einigentee "$1"
Titelfeldern hinzugefügt) Geben Sie beispielsweise beim Ausführen des Skripts eine Outfile an./queryclean newquery.csv
quelle
Während die Frage gestellt wird
sed
, könnte man die Probleme von sed mit Python umgehen:Dieser Code ist sowohl mit Python2 als auch mit Python3 kompatibel, sodass beide funktionieren
Probelauf:
quelle
Drei weitere Ansätze:
awk
Perl
GNU grep mit Perl-kompatiblen regulären Ausdrücken und einfachem Perl:
quelle
Dies ist nicht genau die Beantwortung Ihrer Frage oder die Lösung Ihres Problems, aber um die unerwünschten Zeichen loszuwerden, können Sie tr verwenden :
und du wirst bekommen:
quelle
tr
:)Dies ist ein weiteres in Ruby geschriebenes Skript. Die Kommas im Titel bleiben erhalten, die problemlos in jedes Tabellenkalkulationsprogramm importiert werden können, ohne die Spalten zu beschädigen.
Nach dem Ausführen des Programms sieht die erzeugte Ausgabe folgendermaßen aus
quelle
:
darin?