Estoy trabajando con la .csv
salida de esta consulta de datos SE que se ve así (solo con 5022 entradas):
"{
""id"": 281952,
""title"": ""Flash 11.2 No Longer Supported by Google Play""
}"
"{
""id"": 281993,
""title"": ""Netbeans won't open in Ubuntu""
}"
(Y tiene ^M
terminaciones de línea entre [número] y "" título ""). Necesito que se vea así:
281952,Flash 11.2 No Longer Supported by Google Play
281993,Netbeans won't open in Ubuntu
Lo arreglé en un editor de texto determinado que permanecerá sin nombre con bastante facilidad, pero quería crear un script para no tener que volver a hacerlo cada vez que se actualiza la consulta y para que otros puedan usarla. Yo solía sed
...
Esta serie de comandos funciona perfectamente (aunque puede ser ineficiente; es solo una solución de prueba y error):
# 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
Entonces, ¿por qué no esto? Sólo el ^M
y {}
se eliminan, y todo lo demás es todavía allí.
#!/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
Estoy seguro de que mi error es realmente obvio ...
fuente
\r
.jq
se rompió en la primera línea donde el campo del título tenía dos puntos (la primera línea). Todavía no estoy seguro de por quésed
me odia, pero Maté a algunas de las citas y\r
en esta línea/,\r*/{N;/\n.*title.*:\s/{s/,\r*\n.*title.*:\s/,\ /}}
y, finalmente, que funciona como este . Muchas gracias ^ _ ^sed -rn -e 's/\"\"//g' -e 's/^(.*): (.*)\r$/\2/p' QueryR* | paste -d '' - -
y hecho como magia)Lo arreglé gracias a Steeldriver y otros ajustes. Sin refinar pero funciona.
traducción:
s/"{//
Eliminar"{
s/}"//
Eliminar}"
s/^"//
Eliminar"
del inicio de la/,\r/{N;/\n.*title.*:\s/{s/,\r\n.*title.*:\s/,\ /}}
coincidencia de línea,\r
en una línea y[whatever]title[whatever]:
en la siguiente línea, reemplazar todo eso con,
s/""//g
Eliminar todas las comillas dobles dobles restantess/^\s\+//
Eliminar el espacio en blanco del inicio de las líneas/^\s*$/d
Eliminar las líneas vacíass/^id:\ //
Eliminarid:
y dejar espacio después de esos/\\//g
Eliminar las barras invertidas (caracteres de escape para "agregado a algunos campos de título)tee "$1"
especifica un archivo de salida cuando se ejecuta el script, por ejemplo./queryclean newquery.csv
fuente
Si bien la pregunta lo solicita
sed
, uno podría solucionar los problemas de sed con Python:Este código es compatible con python2 y python3, por lo que cualquiera funcionará
Ejecución de muestra:
fuente
Tres enfoques más:
awk
Perl
GNU grep con expresiones regulares compatibles con perl y perl simple:
fuente
Esto no es exactamente responder a su pregunta o resolver su problema, pero para deshacerse de los caracteres no deseados puede usar tr :
y obtendrás:
fuente
tr
:)Este es otro guión escrito en Ruby. Retendrá las comas en el título, que pueden importarse fácilmente a cualquier programa de hoja de cálculo sin romper las columnas.
Después de ejecutar el programa, la salida producida se verá así
fuente
:
dentro de ellos?