使用FPAT定义字段

时间:2019-07-04 02:50:31

标签: bash awk

我正在尝试将数据拆分到awk中的字段中,但是我无法使用FPAT提出正确的正则表达式。

我尝试过:

echo 'C002     2019-06-28;16:03;approved;content=L1-34,EE;not     taken;;1024 ' | awk 'BEGIN {FPAT = "([^ ]+) +[^ ]+|;"} {print "f1:"$1;print "f2:"$2;print "f3:"$3;print "f6:"$6;print "f7:"$7}'

预期结果:

f1:C002
f2:2019-06-28
f3:16:03
f6:not     taken
f7:

3 个答案:

答案 0 :(得分:1)

没有简单的方法可以将随机空间与随机空间分开。
您需要像David所写的那样进行操作,使用;进行分隔,然后按空格分隔第一个字段。

awk -F";" '{split($1,a,"[ \t]+");print "a[1]---"a[1]"\na[2]---"a[2];for (i=1;i<=NF;i++) print i"---"$i}'
a[1]---C002
a[2]---2019-06-28
1---C002     2019-06-28
2---16:03
3---approved
4---content=L1-34,EE
5---not     taken
6---
7---1024

答案 1 :(得分:1)

类似于Jotne的答案,但是您可以编写一个函数来根据自己的意愿分割记录:

awk 'function split_record(string,f,   t,n,m) {
        n=split(string,t,";"); m=split(t[1],f,"[ \t]+")
        for(i=2;i<=n;++i) f[m+i-1]=t[i]
        return m+n-1
     }
     { split_record($0,f) }
     {print "f1:"f[1];print "f2:"f[2];print "f3:"f[3];print "f6:"f[6];print "f7:"f[7]}'

这将返回:

f1:C002
f2:2019-06-28
f3:16:03
f6:not     taken
f7:

您可以按照自己喜欢的任何方式更新拆分记录。

答案 2 :(得分:0)

awk '
    BEGIN { FS=OFS=";" }
    {
        split($1,a,/[[:space:]]+/)
        $1 = ""
        $0 = a[1] FS a[2] $0
        for (i=1; i<=NF; i++) {
            print "f" i ":" $i
        }
    }
' file
f1:C002
f2:2019-06-28
f3:16:03
f4:approved
f5:content=L1-34,EE
f6:not     taken
f7:
f8:1024