2013-03-22 27 views
1

我正在嘗試編寫一個awk程序,它需要兩個由/ so 3/22/2013隔開的日期,並將它們分成三個單獨的數字,以便我可以使用3和22 2013年分開。在Unix中分離Awk輸入

我想程序被稱爲像

awk -f program_file 2/23/2013 4/15/2013 

到目前爲止我有:

BEGIN { 
d1 = ARGV[1] 
d2 = ARGV[2] 
} 

這將接受兩個日期,但我不知道如何打破他們。另外,上面的程序必須用nawk調用,awk說它不能打開2/23/2013。

在此先感謝。

回答

0

你可以決定使用/作爲一個字段分隔符,並通過-F /到GNU awk(或nawk

0

怎麼樣?

[[email protected] opt]# echo 2/23/2013 | awk -F[/] '{print $1}' 
2 
[[email protected] opt]# echo 2/23/2013 | awk -F[/] '{print $2}' 
23 
[[email protected] opt]# echo 2/23/2013 | awk -F[/] '{print $3}' 
2013 
+0

當命令行中的'awk -f prog_file 1/2/3 4/5/6'這樣的日期被讀入時,這將如何工作? – user2177896 2013-03-22 13:51:24

+0

prog_file裏面有什麼? – Satish 2013-03-22 13:59:19

+0

對你的awk答案沒有評論,但我只是想提醒你不要用'#(root)'做這些測試,即使你確信它是安全的。 :D,忽視它,如果它不適合你..我已經從中吸取了教訓,所以當我看到這個時,我提醒人們... – Kent 2013-03-22 14:01:22

2

你不能這樣做。因爲awk認爲你有兩個文件作爲輸入。也就是說,您的日期字符串被視爲文件名。這就是爲什麼你有這個錯誤信息。

如果兩個日期都存儲在shell變量,你可以:

awk -vd1="$d1" -vd2="$d2" BEGIN{split(d1,one,"/");split(d2,two,"/");...}{...}' 

...部分是你的邏輯,在上面的線,分割後的部分存儲在陣列onetwo。例如,你只想打印one元素:

kent$ d1=2/23/2013 
kent$ d2=4/15/2013 
kent$ awk -vd1="$d1" -vd2="$d2" 'BEGIN{split(d1,one,"/");split(d2,two,"/"); for(x in one)print one[x]}' 
2 
23 
2013 

或其他建議,你可以用awk的FS,但你必須這樣做:

kent$ echo $d1|awk -F/ '{print $1,$2,$3}'   
2 23 2013 

,如果你經過兩個瓦爾在一個總之,-F/將無法​​正常工作,除非他們(兩個日期)是在不同的線路

希望它有助於

0

如果你使用的是nawk和awk機器,那麼你有可能使用Solaris並使用/ bin/awk或/ usr/bin/awk,這兩者都是舊的,破碎的awk,絕對不能使用。改爲在Solaris上使用/ usr/xpg4/bin/awk。

不管怎樣,你的問題:

$ cat program_file 
BEGIN { 
    d1 = ARGV[1] 
    d2 = ARGV[2] 

    split(d1,array,/\//) 
    print array[1] 
    print array[2] 
    print array[3] 

    exit 
} 

$ awk -f program_file 2/23/2013 4/15/2013 
2 
23 
2013 

可能有更好的方法,雖然。發佈一些關於你想要做什麼的更多信息,如果你想獲得幫助。