在AWK

2011-09-22 59 views
0

使用shell脚本参数用冒号我有一个包含有这种格式行的文件:在AWK

2011/09/14 12:00:23.525 text 

我写了一个shell脚本,在文本搜索一个给定的表达和排序的所有匹配的行按天和时间。最后,我想放弃指向比作为参数传递的时刻更早的时刻的条目。我使用awk来进行这种过滤。该脚本是这样的:

search=$1 file=$2 day=$3 time=$4 
zgrep -h "$search" $file | sort -k1,1 -k2,2 | awk -v da="$day" ti="$time" '($1 >= day) && ($2>= ti) {print $0}' > out.$$ 

如果我调用:

myScript searchThis file1.txt 2011/09/20 09:16:52.130 

我得到这个错误:

awk: ti=09:16:52.130 
awk: ^syntax error 

能否请你帮我解决这个问题? 非常感谢! 再见

+1

不要你俩变化之前的任务需要'-v'? – Kusalananda

+0

'($ 1> = day)&&($ 2> = ti)'不正确。如果日期部分>日期但时间部分<给定时间会发生什么?例如2050/01/01 01:01:01和1999/01/01 22:22:22。 – Kent

+0

@KAK,非常感谢,我忘记了-v是问题的一部分。 – Federico

回答

1

你可以包装的价值在"? 我测试了下,bash和zsh中,都努力:

kent$ cat a 
2011/09/20 09:16:52.130 
2011/08/20 10:16:52.130 
2011/07/20 05:16:52.130 

kent$ d="2011/08/30 00:23:23" #here used ".." to wrap the date and time 

kent$ awk -v d="$d" '$0>d' a 
2011/09/20 09:16:52.130 

不知道是否有帮助?

0

肯特的回答并没有为我工作。我在cygwin中使用GNU Awk 4.1.3。

我最终发现这个awk: passing variables from bash其中dubiousjim提到你可以在动作之后指定变量值。它不会在BEGIN规则中提供,但这对我的情况来说很好。

所以你可以改变你的脚本是这样的:

search=$1 file=$2 day=$3 time=$4 
zgrep -h "$search" $file | sort -k1,1 -k2,2 | awk '($1 >= day) && ($2>= ti) {print $0}' da="$day" ti="$time" > out.$$