Используйте 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
задан 3 June 2017 в 14:14

6 ответов

Вы можете использовать что-то другое вместо / в качестве разделителя 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
3
ответ дан 18 July 2018 в 12: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.
1
ответ дан 18 July 2018 в 12:14

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

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

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

, если он dd/mm/yyyy, тогда вы можете

-E использовать расширенное регулярное выражение (04|05) [

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

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

На основе вашего образца файла это должно быть достаточно конкретным.

f12] или 05 [0-9]+ не менее одной цифры (конечно, мы могли бы быть более строгими здесь относительно точного форматирования даты, например, день может быть [0-3][0-9] и год 20[0-1][0-9], но, похоже, необходимо в этом случае)

3
ответ дан 18 July 2018 в 12:14

Вы можете использовать что-то другое вместо / в качестве разделителя 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
3
ответ дан 24 July 2018 в 19:56

Подход 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.
1
ответ дан 24 July 2018 в 19:56

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

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

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

, если он dd/mm/yyyy, тогда вы можете

-E использовать расширенное регулярное выражение (04|05) [

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

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

На основе вашего образца файла это должно быть достаточно конкретным.

f12] или 05 [0-9]+ не менее одной цифры (конечно, мы могли бы быть более строгими здесь относительно точного форматирования даты, например, день может быть [0-3][0-9] и год 20[0-1][0-9], но, похоже, необходимо в этом случае)

3
ответ дан 24 July 2018 в 19:56
  • 1
    @Zanna, когда вы используете grep, вы заставляете меня использовать sed :)) – Ravexina 3 June 2017 в 19:18
  • 2
    @Ravexina, пока ни один из вас не использует Perl или Python, это прекрасно в моей книге ^ _0 lel – Sergiy Kolodyazhnyy 3 June 2017 в 19:31

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

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