Grep и Split на основе Pattern - сценарий оболочки - PullRequest
0 голосов
/ 03 октября 2019

У меня большой текстовый файл с шаблоном, показанным ниже:

CAT:D1_XCAT_TE_ID=SE0101900     
CAT:D2_XCAT_TE_ID=SF0101900
CAT:D3_XCAT_TE_ID=SG0101900
.
.
.
.
.
.
DLR:1|1|1|606|P|1|1|
DLR:1|2|1|606|P|1|1|
DLR:1|3|1|606|F|1|1|
.
.
.
CAT:D1_XCAT_TE_ID=D0101901
CAT:D2_XCAT_TE_ID=D0101902
CAT:D3_XCAT_TE_ID=D0101903
.
.
.
DLR:1|1|1|607|P|1|1|
DLR:1|2|1|607|P|1|1|
DLR:1|3|1|607|P|1|1|

Мне нужно получить ключевое слово "XCAT_TE_ID". Пример:

Each of CAT:D1xxx will have one DLR:1|1|xxx
CAT:D2xxx will have one DLR:1|2|xxx
CAT:D3xxx will have one DLR:1|3|xxx

Original :
CAT:D1_XCAT_TE_ID=SE0101900

After split:
D1_XCAT_TE_ID - store in one array
SE0101900 - store in another array

Однако условие для сохранения в массиве, если только значение в 5-м поле - "P" из DLR (разделено на |).

для получения DLRдля CAT:

CAT:D1_XCAT_TE_ID=SE0101900
D1 - this field, number 1 indicates the DLR
To refer to the value of DLR, split the DLR with "|" and get the 2nd field.
2nd field= 1
 then, the value of DLR will be:

DLR:1|1|1|607|P|1|1|

each of CAT record has one DLR record. This is a pair. 

Однако мне нужно сохранить значение, если только значение в 5-м поле "P" из DLR (разделено на |). Я не уверен, как это сделать. пожалуйста, помогите.

1 Ответ

0 голосов
/ 04 октября 2019

С awk вы можете прочитать входной файл один раз, и он будет работать намного быстрее, чем эти повторяющиеся команды. Я не знаю вашего опыта с awk, поэтому я даю эту медленную альтернативу.
Сначала посмотрите на различные значения DLR с

sed -rn 's/^CAT:D([^_]*).*/\1/p' inputfile| sort -u

Комбинацией -r и /p обеспечивает печать только совпадений.
Эта команда будет вводом следующего цикла (после done):

while IFS= read -r dlr; do
   grep -E "^CAT:D${dlr}_|^DLR:[^|]*\|${dlr}\|" inputfile |
      paste -d"=" - - |
      sed -rn 's/[^=]*=([^=]*)=DLR:([^|]*\|){4}P.*/\1/p'
done < <(sed -rn 's/^CAT:D([^_]*).*/\1/p' inputfile | sort -u)

Это решение предполагает, что в записи DLR имеется только одна =(и я могу использовать его в команде вставки), и после каждой записи CAT есть только одна соответствующая запись DLR.

Сначала выбираются только соответствующие строки:

# results without paste processing
CAT:D1_XCAT_TE_ID=SE0101900
DLR:1|1|1|606|P|1|1|
CAT:D1_XCAT_TE_ID=D0101901
DLR:1|1|1|607|P|1|1|
CAT:D2_XCAT_TE_ID=SF0101900
DLR:1|2|1|606|P|1|1|
CAT:D2_XCAT_TE_ID=D0101902
DLR:1|2|1|607|P|1|1|
CAT:D3_XCAT_TE_ID=SG0101900
DLR:1|3|1|606|F|1|1|
CAT:D3_XCAT_TE_ID=D0101903
DLR:1|3|1|607|P|1|1|

Затем команда paste объединяет каждую пару строк

# result without `sed` command (spaces of first record are in the example input)
CAT:D1_XCAT_TE_ID=SE0101900     =DLR:1|1|1|606|P|1|1|
CAT:D1_XCAT_TE_ID=D0101901=DLR:1|1|1|607|P|1|1|
CAT:D2_XCAT_TE_ID=SF0101900=DLR:1|2|1|606|P|1|1|
CAT:D2_XCAT_TE_ID=D0101902=DLR:1|2|1|607|P|1|1|
CAT:D3_XCAT_TE_ID=SG0101900=DLR:1|3|1|606|F|1|1|
CAT:D3_XCAT_TE_ID=D0101903=DLR:1|3|1|607|P|1|1|

Теперь sed используется для выбора строк с |P и отображения подстроки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...