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
.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 ^ _ ^