【问题标题】:WiFi networks as clustered bar chartsWiFi 网络作为集群条形图
【发布时间】:2018-11-13 23:38:23
【问题描述】:

我正在使用我的 Airport 实用程序来获取我周围的所有可用 WiFi 网络,并且我想使用 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

对于bar chart,我需要将其转换为这种格式——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

【问题讨论】:

  • 我不明白您想要实现的表格格式。例如,当一个 SSID 对同一个频道有多个条目(例如,DESIGN-DEV 对频道 1 有三个条目)时,你会怎么做?
  • @user8153 没错。这是我现在才明白的。出于我的目的,我使用tail -n 1 仅使用最高价值。表格的格式应该类似于this example。

标签: bash shell gnuplot


【解决方案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";
  }
}

这个想法是检查文件和每一行:

  1. 检查 ssid 是否已经被看到(对于 通道),如果没有,则为其分配一个增量索引(以便将此索引与结果表的行/列索引相关联)
  2. 将对应的数据值保存到以通道和ssid名称为索引的二维数组中

在脚本结束时,可以遍历所有唯一的通道/ssid 名称并以表格的形式打印相应的值。

【讨论】:

  • 感谢您的快速答复。我正在尝试这样 - 双重 for loop 对我来说似乎是一个相当不雅的解决方案,但它正在慢慢朝着正确的方向发展。 ?
猜你喜欢
  • 2012-06-02
  • 2022-09-23
  • 1970-01-01
  • 1970-01-01
  • 2022-11-01
  • 2020-08-05
  • 2021-08-10
  • 2020-05-21
  • 1970-01-01
相关资源
最近更新 更多