我正在尝试编写一个Awk程序,该程序将两个日期分隔为/ so 3/22/2013,并将它们分成三个单独的数字,以便我可以分别使用3和22和2013。
我希望程序像
一样被调用awk -f program_file 2/23/2013 4/15/2013
到目前为止,我有:
BEGIN {
d1 = ARGV[1]
d2 = ARGV[2]
}
这将接受两个日期,但我不知道如何分手。另外,必须使用nawk调用上述程序,awk表示无法打开2/23/2013。
提前致谢。
答案 0 :(得分:2)
你不能以你的方式去做。因为awk认为你有两个文件作为输入。也就是说,您的日期字符串被视为文件名。这就是你收到错误信息的原因。
如果两个日期存储在shell变量中,您可以:
awk -vd1="$d1" -vd2="$d2" BEGIN{split(d1,one,"/");split(d2,two,"/");...}{...}'
...
部分是您的逻辑,在上面一行中,拆分部分存储在数组one
和two
中。例如,您只想打印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/
将不起作用,除非它们(两个日期)在不同的行中
希望有所帮助
答案 1 :(得分:0)
您可以决定使用/
作为字段分隔符,并将-F /
传递给GNU awk
(或nawk
)
答案 2 :(得分:0)
怎么样?
[root@01 opt]# echo 2/23/2013 | awk -F[/] '{print $1}'
2
[root@01 opt]# echo 2/23/2013 | awk -F[/] '{print $2}'
23
[root@01 opt]# echo 2/23/2013 | awk -F[/] '{print $3}'
2013
答案 3 :(得分: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
但可能有更好的方法。如果您需要帮助,请发布一些有关您尝试做的事情的更多信息。