awk one liner

The below code is a simple modified sample from a file with millions of lines containing hundreds of extra columns xxx="yyy" ...

<app addr="1.2.3.4" rem="1000" type="aaa" srv="server1" usr="user1"/>
<app usr="user2" srv="server2" rem="1001" type="aab" addr="1.2.3.5"/>

What's the most efficient awk one liner in order to have the below result? (srv-usr-addr)

server1-user1-1.2.3.4
server2-user2-1.2.3.5

P.S - Sed or perl are welcome too..

Thanks in advance

I don't know if is the most efficient script, but try:

awk -F\" '{for(i=1; i<=NF; i+=2) {sub(/.* /,x,$i); A[$i]=$(i+1)} print A["srv="], A["usr="], A["addr="]}' OFS=- file

-or-

awk -F\" 'function pr(){print A["srv="], A["usr="], A["addr="]} {A[$1]=$2} /<app/ && NR>1{pr()} END{pr()}' RS=" " OFS=- file
1 Like

Or some like this:

awk ' {
for(i=1;i < NF;i++) {
if($i ~ /srv/) { split($i, s, "\"") }
if($i ~ /usr/) { split($i, u, "\"") }
if($i ~ /addr/) { split($i, a, "\"") }

} {print s[2]"-"u[2]"-"a[2]}
} ' file
1 Like