在awk

时间:2017-08-14 20:20:11

标签: awk

awk(Ubuntu 16.04上的GNU Awk 4.1.3)中,在第一次出现分隔符时将字符串拆分为两个子串的最佳方法是什么(此处为:) ,即使它包含更多的分隔符,它仍然保留下半部分?

我目前看起来像这样(简化)(为可见性添加了换行符):

awk '/^[^=]+:/ { 
        split($0, a, ":") ; 
        system("echo part 1: "a[1]) ; 
        print "part 2: "a[2] ;
     }'

我需要调用一个外部应用程序,第一部分作为参数(这里仅使用echo作为示例)并按原样打印第二部分,而不使用第一个分隔第1部分和第2部分的冒号,但是否则没有动过。

这里的问题是输入行可能包含多个冒号,导致分割成具有两个以上元素的数组。按照上面的方法,我会在第二次冒号之后忽略所有内容。

2 个答案:

答案 0 :(得分:2)

请勿使用split。使用index

awk '/^[^=]+:/ { 
        k=index($0, ":")
        a[1]=substr($0,1,k-1)
        a[2]=substr($0,k+1);
        system("echo part 1: "a[1]) ; 
        print "part 2: "a[2] ;
     }'

答案 1 :(得分:2)

只需使用match()的第三个参数:

$ echo 'one:two:three:four' | awk '
match($0,/([^:]+):(.*)/,a) {
    system("echo part 1: "a[1])
    print "part 2: "a[2]
}'
part 1: one
part 2: two:three:four