Используйте 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
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)
матч04
или же05
[0-9]+
хотя бы одну цифру (конечно, мы могли бы быть более строгими в отношении точного форматирования даты, например, день может быть[0-3][0-9]
и год20[0-1][0-9]
, но в этом случае, похоже, нет необходимости)
Вы можете использовать что-то другое вместо /
как sed
разделитель.
sed -n '\:08/09/2011:p' file
или с регулярным выражением и '#' в качестве разделителя:
sed -nr "\#,[0-9]{2}/[0-9]{2}/[0-9]{4},#p" file
только для апреля и мая (дд / мм / гггг):
sed -nr "\#,[0-9]{2}/0[45]{1}/[0-9]{4},#p" file
или (мм / дд / ггг):
sed -nr "\#,0[45]{1}/[0-9]{2}/[0-9]{4},#p" file
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. Это согласуется с комментарием ОП, где они указали:
... Формат даты: мм: дд: гггг.