Определить поле с помощью FPAT - PullRequest
0 голосов
/ 04 июля 2019

Я пытаюсь разбить данные на поля в 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 ]

1 голос
/ 04 июля 2019

Немного похоже на ответ Йотна, но вы могли бы написать функцию для разделения записи в соответствии с вашими пожеланиями:

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:

Вы можете обновить разделенную запись любым способом.

1 голос
/ 04 июля 2019

Нет простого способа отделить случайное пространство от случайного.
Вам нужно сделать, как пишет Дэвид, отделить, используя ;, а затем разделить первое поле на пробел.

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
0 голосов
/ 04 июля 2019
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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...