【问题标题】:Print matched field separators in awk在 awk 中打印匹配的字段分隔符
【发布时间】:2015-02-04 11:55:32
【问题描述】:

鉴于以下记录

01-01-2012 18:02 some data 01-11-2014 20:22 some other data 10-02-2014 14:00 more data still

我正在尝试对日期、时间和数据进行分组,并将它们打印在单独的行上,如下所示:

01-01-2012 18:02 some data
01-11-2014 20:22 some other data
10-02-2014 14:00 more data still

但是,到目前为止我所拥有的:

echo '01-01-2012 18:02 some data 01-11-2014 20:22 some other data 10-02-2014 14:00 more data still' | awk -F '[0-9]*-[0-9]*-[0-9]* [0-9]*:[0-9]*' '{ for ( n=1; n<=NF; n++ ) print $n }

结果:

 some data 
 some other data 
 more data still

缺少日期和时间。它们是字段分隔符,因此不会打印。

如何修改我的 awk 脚本以打印与正则表达式匹配的每个字段分隔符?

【问题讨论】:

    标签: regex bash awk


    【解决方案1】:

    通过 awk

    awk '{for (i=1;i<=NF;i++) printf ($i~/-..-/)?RS $i:FS $i}' infile
    

    解释

    • for loop:逐个读取元素,元素被空格分割。
    • printf : 打印元素不返回
    • printf ($i~/-..-/)?RS $i:FS $i - 可以扩展为 if-else 语句: if ($i~/-..-/) {print RS $i) else (print FS $i)

    【讨论】:

    • 如果模式 [0-9]+-[0-9]+-[0-9]+ 出现在数据中,则中断
    【解决方案2】:

    方法

    awk '{for(i=2;i<=NF;i++)if($i~/[0-9]+-[0-9]+-[0-9]+/)$i="\n"$i}1' file
    

    【讨论】:

    • 您忘记通过1print 打印结果
    • @matsjoyce 怎么尴尬?
    • @matsjoyce 是的,我在发表评论后注意到了一秒钟哈,今天做了一场噩梦!
    • 如果模式 [0-9]+-[0-9]+-[0-9]+ 出现在数据中,则中断
    【解决方案3】:

    使用 gnu awk:

    awk -v RS='[0-9]+-[0-9]+-[0-9]+ [0-9]+:[0-9]+' '!NF{s=RT;next} {print s $0}' file
    01-01-2012 18:02 some data
    01-01-2012 18:02 some other data
    01-01-2012 18:02 more data still
    

    编辑:您可以使用非 gnu awk:

    awk '{gsub(/[[:blank:]]+[0-9]+-[0-9]+-[0-9]+ [0-9]+:[0-9]+/, "\n&"); 
          gsub(/\n[[:blank:]]+/, "\n")} 1' file
    01-01-2012 18:02 some data
    01-11-2014 20:22 some other data
    10-02-2014 14:00 more data still
    

    也可以使用grep -P

    grep -oP '[0-9]+-[0-9]+-[0-9]+ [0-9]+:[0-9]+.+?(?=[0-9]+-[0-9]+-[0-9]+|$)' file
    01-01-2012 18:02 some data
    01-11-2014 20:22 some other data
    10-02-2014 14:00 more data still
    

    【讨论】:

    • 见我上面的评论:awk only
    • 谢谢,如果模式[0-9]+-[0-9]+-[0-9]+ 出现在数据中,这不会中断。我使用 ox X 的免费 BSD awk(非 GNU)。
    • 是的,没错。我还在 BSD awk(在 OSX 上)上对其进行了测试。
    猜你喜欢
    • 2018-02-19
    • 1970-01-01
    • 1970-01-01
    • 2014-04-27
    • 2020-12-06
    • 2021-12-26
    • 2020-12-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多