Je travaille avec la .csv
sortie de cette requête de données SE qui ressemble à ceci (uniquement avec 5022 entrées):
"{
""id"": 281952,
""title"": ""Flash 11.2 No Longer Supported by Google Play""
}"
"{
""id"": 281993,
""title"": ""Netbeans won't open in Ubuntu""
}"
(Et il a des ^M
fins de ligne entre [nombre] et "" titre ""). J'en ai besoin pour ressembler à ceci:
281952,Flash 11.2 No Longer Supported by Google Play
281993,Netbeans won't open in Ubuntu
J'ai corrigé cela dans un certain éditeur de texte qui restera assez facilement sans nom, mais je voulais créer un script pour ne plus avoir à le refaire chaque fois que la requête est actualisée et que d'autres puissent l'utiliser. J'ai utilisé sed
...
Cette série de commandes fonctionne parfaitement (même si elle peut bien être inefficace; ce n'est qu'une solution d'essai et d'erreur):
# 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
Alors, pourquoi ça? Seuls les ^M
et {}
sont supprimés, et tout le reste est toujours 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
Je suis sûr que mon erreur est vraiment évidente ...
la source
\r
.jq
cassé sur la première ligne où le champ de titre avait deux points (la première ligne). Je ne sais toujours pas pourquoised
je me déteste, mais j'ai tué certaines des citations et\r
dans cette ligne/,\r*/{N;/\n.*title.*:\s/{s/,\r*\n.*title.*:\s/,\ /}}
et finalement ça fonctionne comme ça . Merci beaucoup ^ _ ^sed -rn -e 's/\"\"//g' -e 's/^(.*): (.*)\r$/\2/p' QueryR* | paste -d '' - -
faites comme par magie)Je l'ai réparé grâce au tournevis en acier et au bricolage. Non raffiné mais fonctionne.
Traduction:
s/"{//
Supprimer"{
s/}"//
Supprimer}"
s/^"//
Supprimer"
du début de la ligne/,\r/{N;/\n.*title.*:\s/{s/,\r\n.*title.*:\s/,\ /}}
correspondance,\r
sur une ligne et[whatever]title[whatever]:
sur la ligne suivante, remplacer tout cela avec,
s/""//g
supprimer tous les doubles guillemets doubles restants dess/^\s\+//
espaces Supprimer du début des lignes/^\s*$/d
Supprimer les lignes videss/^id:\ //
Retirerid:
et de l' espace aprèss/\\//g
enlever les antislashs (caractères d'échappement pour "ajouté à certains champs de titre)tee "$1"
spécifiez un fichier externe lors de l'exécution du script, par exemple./queryclean newquery.csv
la source
Alors que la question le demande
sed
, on pourrait contourner les problèmes de sed avec Python:Ce code est compatible avec python2 et python3, donc l'un ou l'autre fonctionnera
Exemple d'exécution:
la source
Trois autres approches:
awk
Perl
Grep GNU avec des expressions rationnelles compatibles perl et simple perl:
la source
Ce n'est pas exactement répondre à votre question ou résoudre votre problème, mais pour vous débarrasser des caractères indésirables, vous pouvez utiliser tr :
et vous obtiendrez:
la source
tr
:)Ceci est un autre script écrit en Ruby. Il conservera les virgules dans le titre, qui peuvent être facilement importées dans n'importe quel programme de feuille de calcul sans casser les colonnes.
Après l'exécution du programme, la sortie produite ressemblera à ceci
la source
:
intérieur d'eux?