Используйте sed и grep для извлечения данных за определенные месяцы в файл с отметками времени

У меня есть текстовый файл с данными за шесть лет (2011-2016). Я хочу извлечь только данные за апрель и май за все шесть лет.

@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 

Я использую команды grep и sed для фильтрации данных, но они не показывают желаемый результат. Я использую эти команды:

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
задан 3 June 2017 в 14:14

3 ответа

В вашем файле похоже, что формат даты на самом деле dd/mm/yyyy или mm/dd/yyyy, но в ваших командах вы предполагаете, что это dd-mm-yyyy или yyyy-mm-dd.

Вы должны быть в состоянии grep строки апреля и мая, предполагая, что формат mm/dd/yyyy с этим выражением

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

, если это dd/mm/yyyy, тогда вы можете использовать:

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

Исходя из примера файла, они должны быть достаточно конкретными.

Примечания

  • -E используют расширенное регулярное выражение
  • (04|05) match 04 или 05
  • [0-9]+ хотя бы одну цифру ( конечно, мы можем быть более строгими в отношении точного форматирования даты, например, день может быть [0-3][0-9] и год 20[0-1][0-9], но в этом случае, похоже, нет необходимости)
0
ответ дан 3 June 2017 в 14:14

Можно использовать что-то еще вместо / как sed разделитель.

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

или с regex и '#' как разделитель:

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

на апрель и май только (dd/mm/yyyy):

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

или (mm/dd/yyy):

sed -nr "\#,0[45]{1}/[0-9]{2}/[0-9]{4},#p" file
0
ответ дан 4 June 2017 в 00:14

Подход 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 

, Что происходит здесь, состоит в том, что мы используем запятую в качестве разделителя для столбцов и печати, если и только если 4-й столбец (который является датой) запускается с 04 или 05. Это согласовывается с комментарий OP, где они заявили:

... Формат даты является mm:dd:yyyy.

0
ответ дан 4 June 2017 в 00:14

Другие вопросы по тегам:

Похожие вопросы: