使用 sed 和 grep 从带有时间戳的文件中提取特定月份的数据

使用 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 

我正在使用grepsed命令来过滤数据,但它没有显示我想要的结果。我正在使用这些命令:

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

答案1

您可以使用其他东西来代替/作为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

答案2

在您的文件中,日期格式实际上看起来是dd/mm/yyyymm/dd/yyyy,但在您的命令中,您假设它是dd-mm-yyyyyyyy-mm-dd

您应该能够看到grep4 月和 5 月的行,假设格式是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)匹配0405
  • [0-9]+至少一位数字(当然,我们可以对确切的日期格式更加严格,例如一天可以是[0-3][0-9]一年20[0-1][0-9],但在这种情况下似乎没有必要)

答案3

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。

相关内容