2013-03-18 35 views
-2

专栏中,我有这样的一段代码:选择日期只有在AWK

{ 
    if ($4 ~search) 
    { 
     match ($4, /([0-9]{2}\/([a-zA-z]{3})\/([0-9]{4}))/, dates) 

     print dates[1] "\t" dates[2] "\t" dates[3] 
    } 
} 

,当它时,它会产生这样的:

[19/Oct/2012:12:34:32 
[19/Oct/2012:12:34:32 
[19/Oct/2012:12:34:33 

所以理论上它的工作和生产一些什么我想但我怎么才能得到它只是产生19/Oct/2012的任何建议?

我的问题是,我想输出只产生日期19/10/2012?

+1

为什么有时'日期'有时'日期'?错字?你能粘贴更多的代码吗?或输入?? – Kent 2013-03-18 14:34:52

+1

您的正则表达式和您的输出完全不符? – 2013-03-18 14:43:33

+0

请编辑您的问题,并粘贴几行输入。解决方案*可能与BEGIN {FS =“:”} {print $ 1}“一样简单。没有有效的输入,就不可能说。 – 2013-03-18 15:00:40

回答

1

你需要修正你的正则表达式:

{ 
    match ($4,/[0-9]{2}\/[a-zA-z]{3}\/[0-9]{4}/,date) 
    print date[0] 
} 

将输出:

19/Oct/2012 
19/Oct/2012  
19/Oct/2012 

注:

  • 您当前regexp寻找日期用数字表示的月 19/10/2012不是19/Oct/2012

  • 您的捕获组未被匹配(不平衡括号)

  • 在你给出的例子中,年份是20012而不是2012!?

  • 您从datesdate

  • date[0]存储整个比赛,而date[n]涉及第n个捕获组。

有可能是你的整体问题的一个更好的方法,但它不可能用非常少的(和非常错误的)给予信息说。

编辑:

,这似乎是唯一剩下的问题是错位的捕获组。

{ 
    match ($4, /([0-9]{2})\/([a-zA-z]{3})\/([0-9]{4})/, dates)  
    print dates[1] "\t" dates[2] "\t" dates[3] 
} 

将输出:

19 Oct 2012 
19 Oct 2012 
19 Oct 2012 

但你的问题,你说出你想要的格式19/Oct/2012(这是我的第一个建议做什么)输出!?

+0

嘿谢谢你,但这不起作用,但无论如何感谢他们是非常有帮助的笔记。 – user2160949 2013-03-18 15:30:02

+0

@ user2160949你添加的* new *代码没有更多的说明,你似乎已经修复的唯一问题是'日期'而不是'日期'正确使用所有我强调你没有修复的正则表达式问题。您需要使用输入的示例行更新问题,并描述您正在尝试执行的操作以及预期输出,因为我已经突出显示了您的语法错误。 – 2013-03-18 16:03:02

+0

嘿再次改变它20012是一个typeo,也打印[0]是什么即时通讯打印反正所以产生相同的结果 – user2160949 2013-03-18 16:08:24

0

忽略您的代码示例和输出中的错误,如果你想要做的是剥离出领先[,那么你可以只substr比赛的第2个字符开始:

print substr(date[0], 2)

然而,我建议修改您的正则表达式以输出正确的匹配。

+1

如果你想正确地做到这一点,做什么sudo_O建议:http://stackoverflow.com/a/15479679/551467 – pestrella 2013-03-18 15:09:28