web-dev-qa-db-fra.com

Utilisez sed et grep pour extraire des données pour des mois particuliers dans un fichier avec des horodatages

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
2
Vaibhav Kumar

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.

Remarques

  • -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)
3
Zanna

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
3
Ravexina

Approche Perl

$ 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.

1