Я использую свою служебную программу Airport, чтобы получить все доступные сети Wi-Fi вокруг меня, и я хочу отобразить их в виде столбчатой диаграммы с кластером с помощью gnuplot. Я не могу понять, как преобразовать данные в форму, с которой может работать gnuplot.
Мой neighbours.dat выглядит так:
CHANNEL RSSI SSID
1 -54 DESIGN-DEV
1 -54 DESIGN-EMPLOYEE-DA
1 -54 DESIGN-GUEST
1 -56 DESIGN-DEV
1 -56 DESIGN-EMPLOYEE-DA
1 -56 DESIGN-GUEST
1 -56 cwlanoffice
1 -56 llc-net
1 -66 DESIGN-DEV
1 -66 DESIGN-EMPLOYEE-DA
1 -66 DESIGN-GUEST
6 -56 WLAN-A23120
6 -60 WLAN-73CF94
6 -71 DESIGN-EMPLOYEE-DA
6 -71 DESIGN-GUEST
6 -72 DESIGN-DEV
6 -74 ecp-eco2016
6 -75 cwlanoffice
6 -75 llc-net
6 -76 CWLANGuest
6 -84 CWLANGuest
6 -84 TIMTIM
6 -85 llc-net
11 -39 WLAN-BKH64S
11 -67 cwlanoffice
11 -67 llc-net
11 -69 CWLANGuest
36 -57 WLAN-73CF94
36 -89 CWLANGuest
36 -89 cwlanoffice
36 -90 llc-net
44 -65 CWLANGuest
44 -66 cwlanoffice
44 -66 llc-net
44 -80 ecp-eco2016
52 -40 WLAN-BKH64S
52 -56 DESIGN-DEV
52 -56 DESIGN-GUEST
52 -57 DESIGN-EMPLOYEE-DA
100 -73 DESIGN-DEV
100 -73 DESIGN-GUEST
100 -74 DESIGN-EMPLOYEE-DA
108 -47 DESIGN-DEV
108 -47 DESIGN-EMPLOYEE-DA
108 -47 DESIGN-GUEST
108 -61 DESIGN-DEV
108 -61 DESIGN-EMPLOYEE-DA
108 -62 DESIGN-GUEST
132 -66 CWLANGuest
132 -66 cwlanoffice
132 -66 llc-net
Для гистограмма мне нужно поместить его в этот формат - с SSID в качестве моих столбцов и CHANNEL в качестве моих строк:
SSID1 SSID2 SSID3 SSID4 SSID5
Channel1 -56 -20 -19 -47
Channel2 -38 -21 -28
Вы можете помочь мне в этом? Моя последняя попытка - использовать уникальные SSID и попытаться создать с ними таблицу.
sort -k3 -u neighbours.dat | awk '{print $3}' > neighbours-ssids.dat
c=$(wc -l < neighbours-ssids.dat)
echo $c
for (( i = 0; i < $c; i++ )); do
awk 'NR=='$i neighbours-ssids.dat
done
@ user8153 Совершенно верно. Я только что это понял. Для моей цели я использую tail -n 1 только для работы с наивысшим значением. Формат таблицы должен выглядеть примерно так, как в этот пример.





Решение gawk может быть следующим:
BEGIN {
num_of_ssids = 0
num_of_channels = 0
}
{
ssid = $3
if (!(ssid in data_ssid)) {
data_ssid[ssid] = num_of_ssids;
idx_to_ssid[num_of_ssids] = ssid;
num_of_ssids++;
}
channel = $1
if (!(channel in data_chanel)) {
data_chanel[channel] = num_of_channels;
idx_to_channel[num_of_channels] = channel;
num_of_channels++;
}
data[channel][ssid] = $2
}
END{
for(j=0;j<num_of_ssids;j++) {
ssid = idx_to_ssid[j];
printf "\t%s", ssid;
}
printf "\n";
for(i=0;i<num_of_channels;i++) {
channel = idx_to_channel[i];
printf "%s", channel;
for(j=0;j<num_of_ssids;j++) {
ssid = idx_to_ssid[j];
printf "\t%s", data[channel][ssid];
}
printf "\n";
}
}
Идея состоит в том, чтобы просмотреть файл и для каждой строки:
В конце скрипта можно перебрать все уникальные имена каналов / ssid и вывести соответствующее значение в виде таблицы.
Спасибо за быстрый ответ. Я пробую вот так - двойной for loop показался мне довольно нелегким решением, но медленно движется в правильном направлении. ?
Я не понимаю, какой формат таблицы вы хотели бы получить. Например, что вы делаете, когда SSID имеет несколько записей для одного и того же канала (например, DESIGN-DEV имеет три записи для канала 1)?