Use sed e grep para extrair dados para meses específicos em um arquivo com data e hora

3

Eu tenho um arquivo de texto com seis anos (2011-2016) de dados. Eu quero extrair apenas dados de abril e maio de todos os seis anos.

@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 

Estou usando os comandos grep e sed para filtrar os dados, mas não está mostrando o resultado desejado. Eu estou usando esses comandos:

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
    
por Vaibhav Kumar 03.06.2017 / 09:28

3 respostas

3

Você pode usar outra coisa em vez do delimitador / as sed .

sed -n '\:08/09/2011:p' file

ou com regex e '#' como delimitador:

sed -nr "\#,[0-9]{2}/[0-9]{2}/[0-9]{4},#p" file

somente para abril e maio (dd / mm / aaaa):

sed -nr "\#,[0-9]{2}/0[45]{1}/[0-9]{4},#p" file

ou (mm / dd / yyy):

sed -nr "\#,0[45]{1}/[0-9]{2}/[0-9]{4},#p" file
    
por Ravexina 03.06.2017 / 17:45
3

Em seu arquivo, parece que o formato de data é, na verdade, dd/mm/yyyy ou mm/dd/yyyy , mas em seus comandos você assume que é dd-mm-yyyy ou yyyy-mm-dd .

Você deve poder grep das linhas de abril e de maio, supondo que o formato seja mm/dd/yyyy com essa expressão

grep -E '(04|05)/[0-9]+/[0-9]+' file

se for dd/mm/yyyy , você poderá usar:

grep -E '[0-9]+/(04|05)/[0-9]+' file

Com base no seu exemplo de arquivo, eles devem ser específicos o suficiente.

Notas

  • -E usa regex estendido
  • (04|05) correspondência 04 ou 05
  • [0-9]+ pelo menos um dígito (é claro que poderíamos ser mais rigorosos aqui sobre a formatação exata da data, por exemplo, um dia poderia ser [0-3][0-9] e um ano 20[0-1][0-9] , mas não parece haver necessidade neste caso )
por Zanna 03.06.2017 / 10:15
1

abordagem 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 

O que acontece aqui é que usamos vírgula como separador para colunas, e imprimimos se e somente se a quarta coluna (que é data) começa com 04 ou 05. Isso é consistente com Comentário do OP onde eles afirmou:

  

... O formato da data é mm: dd: aaaa.

    
por Sergiy Kolodyazhnyy 03.06.2017 / 18:21