Pracuję z danymi .csv
wyjściowymi tego zapytania danych SE, które wygląda tak (tylko z 5022 wpisami):
"{
""id"": 281952,
""title"": ""Flash 11.2 No Longer Supported by Google Play""
}"
"{
""id"": 281993,
""title"": ""Netbeans won't open in Ubuntu""
}"
(I ma ^M
końcówki linii między [liczba], a „„ tytuł ””). Potrzebuję go wyglądać tak:
281952,Flash 11.2 No Longer Supported by Google Play
281993,Netbeans won't open in Ubuntu
Naprawiłem to w pewnym edytorze tekstu, który z łatwością pozostanie bezimienny, ale chciałem stworzyć skrypt, aby nie musiałem tego robić za każdym razem, gdy zapytanie jest odświeżane, aby inni mogli go używać. Użyłem sed
...
Ta seria poleceń działa idealnie (chociaż może być nieefektywna; jest to tylko rozwiązanie prób i błędów):
# 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
Dlaczego tak nie jest? Tylko ^M
i {}
zostaną usunięte, a wszystko inne nadal tam jest.
#!/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
Jestem pewien, że mój błąd jest naprawdę oczywisty ...
źródło
\r
.jq
złamał się w pierwszym wierszu, w którym pole tytułowe miało dwukropek (pierwszy wiersz). Wciąż nie jestem pewien, dlaczegosed
mnie nienawidzi, ale zabiłem niektóre z cytatów i\r
na tej linii/,\r*/{N;/\n.*title.*:\s/{s/,\r*\n.*title.*:\s/,\ /}}
i wreszcie działa jak ten . Wielkie dzięki ^ _ ^sed -rn -e 's/\"\"//g' -e 's/^(.*): (.*)\r$/\2/p' QueryR* | paste -d '' - -
zrobiłem to jak magia)Naprawiłem to dzięki steeldriver i dalszemu majsterkowaniu. Nierafinowane, ale działa.
tłumaczenie:
s/"{//
Usuń"{
s/}"//
Usuń}"
s/^"//
Usuń"
od początku/,\r/{N;/\n.*title.*:\s/{s/,\r\n.*title.*:\s/,\ /}}
dopasowania do linii,\r
w jednym wierszu i[whatever]title[whatever]:
w następnym wierszu, zamień wszystko na,
s/""//g
Usuń wszystkie pozostałe podwójne podwójne cudzysłowys/^\s\+//
Usuń białe spacje na początku linii/^\s*$/d
Usuń puste linies/^id:\ //
Usuńid:
i spację po nims/\\//g
Usuń znaki odwrotne „dodane do niektórych pól tytułu)tee "$1"
określ na przykład plik wyjściowy podczas uruchamiania skryptu./queryclean newquery.csv
źródło
Podczas gdy pytanie nasuwa
sed
, można obejść problemy związane z sed z Pythonem:Ten kod jest zgodny zarówno z python2, jak i python3, więc oba będą działać
Przykładowy przebieg:
źródło
Trzy kolejne podejścia:
awk
Perl
GNU grep z wyrażeniami zgodnymi z Perlem i prostym perlem:
źródło
To nie jest dokładnie odpowiedź na pytanie lub rozwiązanie problemu, ale aby pozbyć się niechcianych postaci, możesz użyć tr :
a dostaniesz:
źródło
tr
To kolejny skrypt napisany w Ruby. Zachowuje przecinki w tytule, które można łatwo importować do dowolnego programu arkusza kalkulacyjnego bez rozbijania kolumn.
Po uruchomieniu programu wygenerowane dane wyjściowe będą wyglądały następująco
źródło
:
nimi zawarte?