我正在尝试将数据拆分到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:
答案 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