web-dev-qa-db-ja.com

sedとgrepを使用して、タイムスタンプ付きのファイル内の特定の月のデータを抽出します

6年間(2011-2016)のデータを含むテキストファイルがあります。 6年間すべての4月と5月のデータのみを抽出します。

@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
Vaibhav Kumar

ファイルでは、日付形式は実際にはdd/mm/yyyyまたはmm/dd/yyyyのように見えますが、コマンドではdd-mm-yyyyまたはyyyy-mm-ddであると想定しています。

この式でmm/dd/yyyyであると仮定すると、grep 4月と5月の行ができるはずです。

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]+少なくとも1桁(もちろん、ここでは正確な日付のフォーマットについてより厳密にすることができます。たとえば、1日は[0-3][0-9]、1年は20[0-1][0-9]ですが、この場合は必要になります)
3
Zanna

/の代わりに、sedの区切り文字として何か他のものを使用できます。

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

または、正規表現と区切り文字として「#」を使用:

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

4月と5月のみ(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
3
Ravexina

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