Файл в таблицу awk - PullRequest
       0

Файл в таблицу awk

0 голосов
/ 19 февраля 2020

Я пытаюсь составить таблицу, прочитав файл.

Вот пример кода, который я пытаюсь скомпилировать:

FHEAD|1|PRMPC|20200216020532|1037|S
TMBPE|2|MOD
    TPDTL|3|72810|1995019|11049-|11049-|Dcto 20|0|5226468|20200216000001|20200222235959|2||1||||
        TPGRP|4|5403307
        TGLIST|5|5031472|1|||
        TLITM|6|101055590
            TPDSC|7|0|||-20||2|1|
        TPGRP|8|5403308
        TGLIST|9|5031473|0|||
    TPDTL|13|10728|1995021|11049-|11049-|Dcto 30|0|5226469|20200216000001|20200222235959|2||1||||
        TPGRP|14|5403310
        TGLIST|15|5031475|1|||
            TLITM|16|210000041
            TLITM|17|101004522
                TPDSC|113|0|||-30||2|1|
        TPGRP|114|5403309
        TGLIST|115|5031474|0|||
            TLITM|116|101047933
            TLITM|117|101004681
            TLITM|118|101028161
                TPDSC|119|0|||-25||2|1|
TPISR|214|101004225|2350|EA|20200216000000|COP|
TTAIL|1135
FTAIL|1136|1134

Я пытался разработать код, но он возвращает все теги в одну строку

for filename in "$input"*.dat; 
    do
    echo "$filename">>"$files"
    a=`awk -F'|' '$1=="FHEAD" && $5!=""{print $5}' "$filename"`
    b=`awk -F'|' '$1=="TPDTL" && $3!=""{print $3}' "$filename"`
    c=`awk -F'|' '$1=="TPDTL" && $4!=""{print $4}' "$filename"`
    d=`awk -F'|' '$1=="TPDTL" && $10!=""{print $10}' "$filename"`
    e=`awk -F'|' '$1=="TPDTL" && $11!=""{print $11}' "$filename"`
    f=`awk -F'|' '$1=="TPDSC" && $6!=""{print $6}' "$filename"`
    g=`awk -F'|' '$1=="TLITM" && $3!=""{print $3}' "$filename"`

Например:

echo -e ${d}

20200216000001 * 20200216000001

Я хотел что-то вроде .

Кто-нибудь может мне помочь?

Заранее спасибо

1 Ответ

0 голосов
/ 19 февраля 2020

Предполагается:

  • Частота появления таких ключевых слов, как FHEAD, TPDTL и т. Д., Неодинакова. При необходимости используйте самый последний.
  • Количество строк должно быть равно количеству TLITM.
  • Таблица должна обновляться при появлении TPDSC.

тогда, пожалуйста, попробуйте следующее:

awk 'BEGIN {FS = "|"; OFS = ","}
    $1 ~ /FHEAD/ {a = $5}
    $1 ~ /TPDTL/ {b = $3; c = $4; d = $10; e = $11}
    $1 ~ /TLITM/ {f[++tlitm_count] = $3}
    $1 ~ /TPDSC/ {g = $6;
        for (i=1; i<=tlitm_count; i++) {
            print a, b, c, d, e, f[i], g
        }
        tlitm_count = 0;
    }
' *.dat

Вывод:

1037,72810,1995019,20200216000001,20200222235959,101055590,-20
1037,10728,1995021,20200216000001,20200222235959,210000041,-30
1037,10728,1995021,20200216000001,20200222235959,101004522,-30
1037,10728,1995021,20200216000001,20200222235959,101047933,-25
1037,10728,1995021,20200216000001,20200222235959,101004681,-25
1037,10728,1995021,20200216000001,20200222235959,101028161,-25

Если вы хотите, чтобы выходным разделителем был пробел, измените значение OFS.

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