2016-01-24 2 views
1

j'ai fichier avec des valeurs de température:modèle Sed pour exclure les valeurs

$ cat temperature.txt 
[1450746005000,18.00],[1450746365000,18.00],[1450746725000,17.94],[1450747085000,17.94],[1450747445000,17.94],[1450747805000,17.94],[1450748165000,17.94],[1450748525000,17.88],[1450748885000,17.88],[1450749245000,17.88],[1450749606000,17.88], 

Parfois, ma station enregistre de mauvaises valeurs telles que: (une deuxième valeur)

[1453634645000,19.06],[1453635364000,[1453658405000,19.13], 

Je voudrais supprimer uniquement une valeur incorrecte et écraser ce fichier. Dans ce cas son [1453635364000,

J'ai trouvé comment rechercher de "bonnes" valeurs. Mais je n'ai aucune idée de comment enlever les mauvaises.

sed 's/\[[^]]*,?\],*//g' temperature.txt > temperature.txt.proper 
rm temperature.txt && mv temperature.txt.proper temperature.txt 
+0

Quelle inventivité est la mauvaise mise en forme? Juste un horodatage sans la température et le crochet fermé, ou l'appareil peut-il devenir plus inventif? Il est probable que votre meilleur pari est de trouver seulement les bonnes valeurs, et pour cela j'utiliserais probablement Perl, mais Python pourrait aussi faire le travail. Par exemple, 'perl -lne 'while (m/(\ [\ d +, \ d + \. \ D +])/g) {print $ 1}' data' imprime les lectures valides une par ligne; et 'perl -ne 'while (m/(\ [\ d +, \ d + \. \ d +])/g) {print" $ 1 "}} END {print" \ n "' data' les affiche tous sur un ligne (en supposant que le fichier de données s'appelle 'data'). –

Répondre

2

Essayez ceci:

sed 's/[[0-9]\+,\[/[/g;s/[[0-9]\+,$//g' file 

Pour modifier votre fichier "en place" ajouter l'option sed -i.

1

Cela pourrait fonctionner pour vous (GNU sed):

sed -r ':a;s/\[[0-9]+,($|\[)/\1/;ta' file 

Cela supprime les numéros suivis d'un , suivi d'un [. Quand deux ou plus de ce type de pattern sont adjacents, la substitution globale est insuffisante et la correspondance de pattern doit recommencer d'où la boucle.