С 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
и отображения подстроки.