J'ai un fichier texte avec six ans (2011-2016) de données. Je veux extraire uniquement les données d'avril et de mai des six années.
@STATION_ID,LATITUDE,LONGITUDE,TIME(GMT),DATE(GMT),AIR_TEMP(°C)
IMDE1611_14164B(PITAMPURA),28.7,77.15,0,08/09/2011,33.5
IMDE1611_14164B(PITAMPURA),28.7,77.15,1,08/09/2011,33.3
IMDE1611_14164B(PITAMPURA),28.7,77.15,2,08/09/2011,33.8
IMDE1611_14164B(PITAMPURA),28.7,77.15,3,08/09/2011,33.8
IMDE1611_14164B(PITAMPURA),28.7,77.15,4,08/09/2011,34.5
IMDE1611_14164B(PITAMPURA),28.7,77.15,5,08/09/2011,35.0
IMDE1611_14164B(PITAMPURA),28.7,77.15,6,08/09/2011,34.9
IMDE1611_14164B(PITAMPURA),28.7,77.15,7,08/09/2011,35.4
J'utilise les commandes grep
et sed
pour filtrer les données, mais le résultat souhaité n'est pas affiché. J'utilise ces commandes:
grep "??-0[4-5]-????" filename.txt > filename.csv
sed -n '/2016-04-01/,/2016-04-30/{/2016-04-30/d; p}' my_delhi.txt
sed -n '/2016-04-01/,/2016-04-30/p' my_delhi.txt
Dans votre fichier, il semble que le format de date soit en fait dd/mm/yyyy
ou mm/dd/yyyy
, mais dans vos commandes, vous supposez qu'il s'agit de dd-mm-yyyy
ou yyyy-mm-dd
.
Vous devriez être capable de grep
les lignes d'avril et mai, en supposant que le format est mm/dd/yyyy
avec cette expression
grep -E '(04|05)/[0-9]+/[0-9]+' file
si c'est dd/mm/yyyy
alors vous pouvez utiliser:
grep -E '[0-9]+/(04|05)/[0-9]+' file
Selon votre exemple de fichier, ceux-ci devraient être suffisamment spécifiques.
-E
utilise une expression rationnelle étendue(04|05)
correspond à 04
ou 05
[0-9]+
au moins un chiffre (bien entendu, nous pourrions être plus stricts ici concernant le formatage exact de la date, par exemple un jour pourrait être [0-3][0-9]
et une année 20[0-1][0-9]
, mais il ne semble pas que être un besoin dans ce cas)Vous pouvez utiliser autre chose que /
comme délimiteur de sed
.
sed -n '\:08/09/2011:p' file
ou avec regex et '#' comme délimiteur:
sed -nr "\#,[0-9]{2}/[0-9]{2}/[0-9]{4},#p" file
pour avril et mai seulement (jj/mm/aaaa):
sed -nr "\#,[0-9]{2}/0[45]{1}/[0-9]{4},#p" file
ou (mm/jj/aaaa):
sed -nr "\#,0[45]{1}/[0-9]{2}/[0-9]{4},#p" file
$ Perl -F'/,/' -ane 'print if $F[4]=~/^(04|05)/' input.txt
IMDE1611_14164B(PITAMPURA),28.7,77.15,2,04/09/2011,33.8
IMDE1611_14164B(PITAMPURA),28.7,77.15,3,05/09/2011,33.8
Ce qui se passe ici, c'est que nous utilisons une virgule comme séparateur pour les colonnes et n'imprimons si et seulement si la 4ème colonne (qui est la date) commence par 04 ou 05. Cela correspond à commentaire de l'OP où ils ont déclaré:
... Le format de la date est mm: jj: aaaa.