NETID="10 20 30"
NAME="eth1 eth2 eth3"
NETS=$(awk -v name="$NAME" -v netid="$NETID" '
BEGIN {
size=split(name, arr_names);
split(netid, arr_netids);
for(i=1; i <= size; i++) {
printf "%s:%s ", arr_names[i], arr_netids[i];
}
}')
echo "$NETS"
Выход
eth1:10 eth2:20 eth3:30
Использование Миллера:
$ mlr --icsvlite --opprint \
reshape -s status,count then unsparsify then reorder -e -f CLEARED finalcount.csv
state CONGESTED CLEARED
NW 11 9
ACT 7 7
QLD - 5
WA 3 2
VIC 2 3
GNU Datamash также удобен для таких вещей, как сводные таблицы (, также известные как перекрестные -табуляции ), хотя, похоже, нет простого способа управлять порядком столбцов:
datamash --header-in --filler=- -t, crosstab 1,2 unique 3 < finalcount.csv | csvformat -T
CLEARED CONGESTED
ACT 7 7
NW 9 11
QLD 5 -
VIC 3 2
WA 2 3
Если вам действительно нужно использовать Awk, должно работать что-то вроде этого:
awk -F, '
NR>1 {s[$1]}
$2 == "CONGESTED" {a[$1]=$3}
$2 == "CLEARED" {b[$1]=$3}
END {
printf "state\tcongested\tcleared\n";
for (k in s)
printf "%s\t%s\t%s\n", k, a[k]=="" ? "-" : a[k], b[k]=="" ? "-" : b[k]
}
' finalcount.csv
$ cat tst.awk
BEGIN { FS=","; OFS="\t" }
{ sub(/\r$/,"") }
NR > 1 {
states[$1]
statuses[$2]
vals[$1,$2] = $NF
}
END {
printf "%s", "state"
for (status in statuses) {
printf "%s%s", OFS, status
}
print ""
for (state in states) {
printf "%s", state
for (status in statuses) {
printf "%s%s", OFS, ((state,status) in vals ? vals[state,status] : "-")
}
print ""
}
}
.
$ awk -f tst.awk file
state CONGESTED CLEARED
QLD - 5
ACT 7 7
WA 3 2
NW 11 9
VIC 2 3
.
$ awk -f tst.awk file | column -s $'\t' -t
state CONGESTED CLEARED
QLD - 5
ACT 7 7
WA 3 2
NW 11 9
VIC 2 3