awk在日期之间提取数据

时间:2015-05-20 13:10:41

标签: awk

如果4月5日到4月10日之间的日期来自第二个字段($ 2),则想要提取订单项。将许多枪zip文件放入该目录。

Inputs.gz

zcat Inputs*.gz | awk 'BEGIN{FS=OFS=","} { if ( (substr($2,1,2) >=5) && (substr($2,1,2) <=10) ) print $0 }'  > Output.txt

我已尝试过以下命令和in-complete

ab,05-APR-15,40,0,6
ab,07-APR-15,55,0,6
ab,10-APR-15,70,0,1

预期产出

{{1}}

请建议......

2 个答案:

答案 0 :(得分:2)

试试这个:

awk -F",|-" '$2 >= 5 && $2 <= 10'

使用FS标志将日期分隔符添加到-F。为了确保它是2015年的APR,您可以单独添加以下测试:

awk -F",|-" '$2 >= 5 && $2 <= 10 && $3=="APR" && $4==15'

虽然这使得日期很容易在前面解析,但如果你想再次打印它,你需要用_date = $2 "-" $3 "-" $4之类的东西重建它。如果您需要一般操作数据,则需要在BEGIN {OFS=","}部分添加回来。

我使用的字段编号假设第一个字段中没有“ - ”分隔符。

我得到以下输出:

ab,05-APR-15,40,0,6
ab,07-APR-15,55,0,6
ab,10-APR-15,70,0,1

如果你有一堆乱七八糟的日期而你真的只关心第二个字段中的那个通过逗号分隔符,你可以使用分割如下:

awk -F"," '{ split($2, darr, "-") } darr[1] >= 5 && darr[1] <= 10 && darr[2]=="APR" && darr[3]==15'

就像说:

  • 对于每一行,使用darr分隔符
  • 将第二个字段解析为-数组
  • 对于每一行,如果逻辑darr[1] >= 5 && darr[1] <= 10 && darr[2]=="APR" && darr[3]==15为真,则打印整行。

答案 1 :(得分:1)

使用正则表达式的另一个简单解决方案

awk  -F',' '$2 ~ /([0][5-9]|10)-APR-15/{ print $0  }' txt
  • -F字段分隔符。
  • $2第二场
  • ~匹配正则表达式
  • '/([0] [5-9] | 10)-APR-15 /`reguler表达式匹配05至09或10 APR-15

使用内部字段分隔符

awk   'BEGIN{ FS="," } $2 ~ /([0][5-9]|10)-APR-15/{ print $0  }' txt

使用明确的日期编号声明

awk   'BEGIN{ FS="," } $2 ~ /(05|06|07|08|09|10)-APR-15/{ print $0  }' txt