在AWK

2011-09-22 18 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.$$