Всякий раз, когда у вас есть дата ввода с тегами (name) = сопоставления значений, лучше сначала создать массив, содержащий эти сопоставления (tag2val[]
ниже), а затем вы можете анализировать любые комбинации полей, присутствующих и / или имеющих указанные c значений, которые вам нравятся, и печатайте все поля, которые вам нравятся, в любом порядке. Например:
$ cat tst.awk
BEGIN { OFS="\t" }
/^[*]/ { prt() }
{
gsub(/^[[:space:]]+|[[:space:]]+$/,"")
gsub(OFS," ")
tag = val = $0
sub(/[[:space:]]*:.*/,"",tag)
sub(/[^:]+:[[:space:]]*/,"",val)
tag2val[tag] = val
}
END { prt() }
function prt( flds, numFlds, fldNr) {
numFlds = split("description,product,vendor,physical id,bus info",flds,/,/)
if ( "bus info" in tag2val ) {
if ( !doneHdr++ ) {
for (fldNr=1; fldNr<=numFlds; fldNr++) {
tag = flds[fldNr]
printf "%s%s", tag, (fldNr<numFlds ? OFS : ORS)
}
}
for (fldNr=1; fldNr<=numFlds; fldNr++) {
tag = flds[fldNr]
val = tag2val[tag]
printf "%s%s", val, (fldNr<numFlds ? OFS : ORS)
}
}
delete tag2val
}
.
$ awk -f tst.awk file | column -s$'\t' -t
description product vendor physical id bus info
Ethernet interface I350 Gigabit Network Connection Intel Corporation 0.3 pci@0000:03:00.3