1

我正在尝试编写一个 Awk 程序,它需要两个由 / 分隔的日期,例如 2013 年 3 月 22 日,并将它们分成三个单独的数字,以便我可以分别使用 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

4 回答 4

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

或其他建议,您可以使用FSawk,但您必须这样做:

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

如果您短时间传递两个变量,-F/则将不起作用,除非它们(两个日期)在不同的行中

希望能帮助到你

于 2013-03-22T13:52:35.787 回答
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

不过可能有更好的方法。如果您需要帮助,请发布有关您尝试做什么的更多信息。

于 2013-03-23T02:45:16.407 回答
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
于 2013-03-22T13:46:32.583 回答
0

您可以决定将其/用作字段分隔符,并传递-F /给 GNU awk(或传递给nawk

于 2013-03-22T13:43:43.857 回答