AWK и несколько пробелов (разделители столбцов) - PullRequest
0 голосов
/ 12 сентября 2018

Доброе утро всем,

Чтобы использовать данные из программного обеспечения издателя, у меня есть функции, которые я могу вызывать через CLI (Linux Shell).

Один из них возвращает мне данные в следующем формате:

2601424 OPTDCBO3 EERP O 0254  5512240 TDCTAC01 B                 00 0000000 N  N
2602451 WHA      EERP O 0254  5512353 03ZEE003 B                 00 0000000 N  N
2602748 OPTDCBO4 EERP O 0254  5512380 TDCTAC01 B                 00 0000000 N  N
2603290 OPTDCBO3 EERP O 0254  5512440 TDCTAC01 B                 00 0000000 N  N
2604594 OPTDCBO3 EERP O 0254  5512560 TDCTAC01 B                 00 0000000 N  N
2605631 OP49LDB1 TRAN O 0254          EDRZZZ02 B     2605627-EDR 00 0000000 N  N
2605657 OP49LDB1 TRAN O 0254          EDRZZZ02 B     2605652-EDR 00 0000000 N  N
2605663 OP49LDB1 TRAN O 0254          EDRZZZ02 B     2605653-EDR 00 0000000 N  N
2606116 OPTDCBO3 EERP O 0254  5513080 TDCTAC01 B                 00 0000000 N  N
2716077 OPTDCBO3 EERP O 0255  5610080 TDCTAC01 B                 00 0000000 N  N
2716564 SOG01    TRAN O 0255 s2716564 TACSOG01 B     2716504-TAC 00 0000000 N  N
2718631 OPTDCBO3 EERP O 0255  5610160 TDCTAC01 B                 00 0000000 N  N
7158273 OPTDCBO4 EERP O 0251  5203300 TDCTAC01 B                 00 0000000 N  N
7158672 WHA      EERP O 0251  5203342 03ZEE001 B                 00 0000000 N  N
7158939 ZZZA4    LIST O 0251                   B     7158938-49W 00 0000000 N  N
7158978 OPTDCBO3 EERP O 0251  5203400 TDCTAC01 B                 00 0000000 N  N
7159853 OPTDCBO4 EERP O 0251  5203540 TDCTAC01 B                 00 0000000 N  N
2724704 SOU02    TRAN I 0255 s2724704 FTP_B    E     2724704-SOU 00 0000000 N  N
2724707 PRODS2I  EERP O 0255  6219255 S2IRCE03 E                 00 0000000 N  N
2724708 SOU01    TRAN I 0255 s2724708 FTP_B    E     2724708-SOU 00 0000001 N  N
2724709 SON01    TRAN O 0255 s2724709 SOUSON11 E     2724708-SOU 00 0000001 N  N

В приведенном выше примере я попытался собрать все случаи, с которыми я могу столкнуться, но даже если это не является исчерпывающим, помощь, которую я ищу, позволит мне решить проблему:)

При возврате моей команды данные отображаются в указанном выше формате в виде столбцов с пробелом для разделения первых 5 столбцов, одним или двумя пробелами (в зависимости от случая) для разделения 5-го и 6-го столбцов. Иногда столбцы 6 и 7 полностью пусты.

Цель состоит в том, чтобы иметь возможность вернуть часть или все эти данные в правильно разделенный текстовый файл (например, с запятыми между каждым полем).

Сегодня, если я хочу получить 1-й и 7-й столбец, я использую следующую команду:

command | awk -F" " '{ print $1,$7 }'

Но, конечно, это дает мне такой результат:

2603290 TDCTAC01
2604594 TDCTAC01
2605631 B
2605657 B
2605663 B
2606116 TDCTAC01
2606214 TDCTAC01
7158672 03ZEE001
7158939 7158938-49W
7158978 TDCTAC01

Awk рассматривает столбцы, заполненные пробелами, как множество соседних разделителей, а не как «пустой» столбец, и поэтому возвращает данные следующего непустого столбца.

Есть ли у вас решение, чтобы последовательность из более чем X пробелов рассматривалась как пустой столбец, при этом управляя тем фактом, что иногда есть два пробела для разделения двух столбцов?

Примечание: Столбец № 6 может состоять из 1-6 числовых символов, поэтому вы не можете просто использовать фиксированную ширину для разделения столбца.

Спасибо!

1 Ответ

0 голосов
/ 12 сентября 2018

по Column N°6 can be composed of 1 to 6 numeric characters, so you cannot simply use a fixed width to delimit the column. - конечно, вы можете. Ширина этого столбца фиксируется на ширине 8 символов (или 9, чтобы лениво включать пространство разделителя) - используйте это и обрежьте начальный / конечный пробел (gsub(/^ +| +/,"",$6)), чтобы оставить значение, которое вас интересует.

Вот как идентифицировать все поля, используя GNU awk для FIELDWIDTHS (для других awk вам необходим цикл while(substr())):

awk -v FIELDWIDTHS="7 9 5 2 5 9 9 2 16 3 8 2 3" '
{
    print "----"
    print $0
    for (i=1;i<=NF;i++) {
        gsub(/^ +| +$/,"",$i)
        print i, "<" $i ">"
    }
}
' file

Например:

$ cat file
2602451 WHA      EERP O 0254  5512353 03ZEE003 B                 00 0000000 N  N
2605657 OP49LDB1 TRAN O 0254          EDRZZZ02 B     2605652-EDR 00 0000000 N  N
2724704 SOU02    TRAN I 0255 s2724704 FTP_B    E     2724704-SOU 00 0000000 N  N

.

$ awk -v FIELDWIDTHS="7 9 5 2 5 9 9 2 16 3 8 2 3" '{ print "----"; print $0; for (i=1;i<=NF;i++) {gsub(/^\s+|\s+$/,"",$i); print i, "<" $i ">"} }' file
----
2602451 WHA      EERP O 0254  5512353 03ZEE003 B                 00 0000000 N  N
1 <2602451>
2 <WHA>
3 <EERP>
4 <O>
5 <0254>
6 <5512353>
7 <03ZEE003>
8 <B>
9 <>
10 <00>
11 <0000000>
12 <N>
13 <N>
----
2605657 OP49LDB1 TRAN O 0254          EDRZZZ02 B     2605652-EDR 00 0000000 N  N
1 <2605657>
2 <OP49LDB1>
3 <TRAN>
4 <O>
5 <0254>
6 <>
7 <EDRZZZ02>
8 <B>
9 <2605652-EDR>
10 <00>
11 <0000000>
12 <N>
13 <N>
----
2724704 SOU02    TRAN I 0255 s2724704 FTP_B    E     2724704-SOU 00 0000000 N  N
1 <2724704>
2 <SOU02>
3 <TRAN>
4 <I>
5 <0255>
6 <s2724704>
7 <FTP_B>
8 <E>
9 <2724704-SOU>
10 <00>
11 <0000000>
12 <N>
13 <N>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...