在Unix中分离Awk输入

时间:2013-03-22 13:37:15

标签: linux unix awk nawk

我正在尝试编写一个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。

提前致谢。

4 个答案:

答案 0 :(得分: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/将不起作用,除非它们(两个日期)在不同的行中

希望有所帮助

答案 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

但可能有更好的方法。如果您需要帮助,请发布一些有关您尝试做的事情的更多信息。