我有包含六年(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
答案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/yyyy
或mm/dd/yyyy
,但在您的命令中,您假设它是dd-mm-yyyy
或yyyy-mm-dd
。
您应该能够看到grep
4 月和 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)
匹配04
或05
[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。