Estou trabalhando com a .csv
saída desta consulta de dados SE que se parece com isso (apenas com entradas 5022):
"{
""id"": 281952,
""title"": ""Flash 11.2 No Longer Supported by Google Play""
}"
"{
""id"": 281993,
""title"": ""Netbeans won't open in Ubuntu""
}"
(E possui ^M
finais de linha entre [número] e "" título ""). Eu preciso que fique assim:
281952,Flash 11.2 No Longer Supported by Google Play
281993,Netbeans won't open in Ubuntu
Corrigi isso em um determinado editor de texto que permanecerá sem nome com muita facilidade, mas eu queria criar um script para não precisar fazer isso novamente toda vez que a consulta for atualizada e para que outros possam usá-lo. Eu usei sed
...
Essa série de comandos funciona perfeitamente (embora possa ser ineficiente; é apenas uma solução de tentativa e erro):
# 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
Então, por que não faz isso? Apenas o ^M
e {}
são removidos, e todo o resto ainda está lá.
#!/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
Tenho certeza que meu erro é realmente óbvio ...
fonte
\r
.jq
quebrou na primeira linha onde o campo de título tinha dois pontos (a primeira linha). Eu ainda não tenho certeza por quesed
me odeia, mas eu matei algumas das citações e\r
nesta linha/,\r*/{N;/\n.*title.*:\s/{s/,\r*\n.*title.*:\s/,\ /}}
e, finalmente, ele funciona como este . Muito obrigado ^ _ ^sed -rn -e 's/\"\"//g' -e 's/^(.*): (.*)\r$/\2/p' QueryR* | paste -d '' - -
e feito como mágica)Eu o consertei graças à chave de aço e outros ajustes. Não refinado, mas funciona.
Tradução:
s/"{//
Remove"{
s/}"//
Remove}"
s/^"//
Remove"
do início da linha de/,\r/{N;/\n.*title.*:\s/{s/,\r\n.*title.*:\s/,\ /}}
partida,\r
em uma linha e[whatever]title[whatever]:
na próxima linha, substituir tudo isso com,
s/""//g
Remova todos os restantes dupla aspass/^\s\+//
Remover espaços em branco do início de linhas/^\s*$/d
Remover linhas vaziass/^id:\ //
Removerid:
e espaço depois ques/\\//g
Remover barras invertidas (caracteres de escape para "adicionado a alguns campos de título)tee "$1"
especifique um arquivo externo ao executar o script, por exemplo./queryclean newquery.csv
fonte
Enquanto a pergunta é solicitada
sed
, é possível solucionar os problemas do sed com o Python:Esse código é compatível com python2 e python3, portanto, ambos funcionarão
Exemplo de execução:
fonte
Mais três abordagens:
awk
Perl
GNU grep com regexes compatíveis com perl e perl simples:
fonte
Isso não está exatamente respondendo à sua pergunta ou resolvendo o problema, mas para se livrar dos caracteres indesejados, você pode usar tr :
e você terá:
fonte
tr
:)Este é outro script escrito em Ruby. Ele reterá as vírgulas no título, que podem ser facilmente importadas para qualquer programa de planilha sem quebrar as colunas.
Após a execução do programa, a saída produzida será semelhante à
fonte
:
dentro deles?