tok19
tok19

Reputation: 41

awk transpose lines based on pattern and move (copy) remaining columns after

how to for this problem where mandatory pattern is "nick" based on which its transposed to column and pattern "MY_" or "MN_" with "MX_" next to it (MX_ pattern should be located on any position in input file under each "NICK" section)

tried out this one awk transpose lines based on pattern and move (copy) before current columns with filling empty fields but its limited in what i would like to achieve

input file:

NICK: MY_JEFF
MX_NOAA; NOBASE-INDEX_OUT_FIF;
SYS-BRAVO_X3; BASE-TREE_OUT_OUT;
A4:82:8; SEAT_25;
SYS-BRAVO_X2
NICK: MN_CAPTAIN
A4:82:8; NOBASE-INDEX_OUT_FIF;
SYS-BRAVO_X1; BASE-TREE_OUT_OUT;
MX_NOOI

desired output:

NICK MY_JEFF MX_NOAA NOBASE-INDEX_OUT_FIF
NICK MY_JEFF MX_NOAA SYS-BRAVO_X3 
NICK MY_JEFF MX_NOAA BASE-TREE_OUT_OUT 
NICK MY_JEFF MX_NOAA A4:82:8 
NICK MY_JEFF MX_NOAA SEAT_25 
NICK MY_JEFF MX_NOAA SYS-BRAVO_X2
NICK MN_CAPTAIN MX_NOOI A4:82:8
NICK MN_CAPTAIN MX_NOOI NOBASE-INDEX_OUT_FIF
NICK MN_CAPTAIN MX_NOOI SYS-BRAVO_X1 
NICK MN_CAPTAIN MX_NOOI BASE-TREE_OUT_OUT

Upvotes: 0

Views: 71

Answers (1)

Ed Morton
Ed Morton

Reputation: 204731

$ cat tst.awk
BEGIN { FS=": |([; ]+)" }
$1 == "NICK" { prt() }
{
    for (i=1; i<=NF; i++) {
        rec[++nf] = $i
    }
}
END { prt() }

function prt(   i, hdr) {
    for (i=3; i<=nf; i++) {
        if ( rec[i] ~ /^MX/ ) {
            break
        }
    }
    hdr = rec[1] OFS rec[2] OFS rec[i]
    delete rec[i]
    for (i=3; i<=nf; i++) {
        if ( rec[i] ~ /[^[:space:]]/ ) {
            print hdr, rec[i]
        }
    }
    delete rec
    nf = 0
}

$ awk -f tst.awk file
NICK MY_JEFF MX_NOAA NOBASE-INDEX_OUT_FIF
NICK MY_JEFF MX_NOAA SYS-BRAVO_X3
NICK MY_JEFF MX_NOAA BASE-TREE_OUT_OUT
NICK MY_JEFF MX_NOAA A4:82:8
NICK MY_JEFF MX_NOAA SEAT_25
NICK MY_JEFF MX_NOAA SYS-BRAVO_X2
NICK MN_CAPTAIN MX_NOOI A4:82:8
NICK MN_CAPTAIN MX_NOOI NOBASE-INDEX_OUT_FIF
NICK MN_CAPTAIN MX_NOOI SYS-BRAVO_X1
NICK MN_CAPTAIN MX_NOOI BASE-TREE_OUT_OUT

Upvotes: 1

Related Questions