【问题标题】:Bash script? Manipulating & graphing collected data from a csv file重击脚本?从 csv 文件中处理和绘制收集的数据
【发布时间】:2018-09-22 13:40:28
【问题描述】:

我正在尝试编写一个脚本来检测我在家中的存在。到目前为止,我已经编写了一个脚本,它将数据从 hcitool lescan 输出到以下格式的 csv 文件中:

    TIMESTAMP MAC_ADDRESS_1 MAC_ADDRESS_2 AD_INFINITUM
    2018-09-22.11:48:34 FF:FF:FF:FF:FF:FF FF:FF:FF:FF:FF:FF FF:FF:FF:FF:FF:FF

我正在尝试弄清楚如何编写脚本以将数据转换为可图形化的格式 - gnuplot 是用于此目的的程序吗?我想这需要一个bash?导入保存所有时间戳的 csv 文件的脚本,然后为每个唯一的 MAC 地址在数组中添加一个新列,然后根据是否每行检测到 Mac 地址,用 1 或 0 填充条目。是否有任何内置命令可以执行/帮助解决此问题,或者我必须自己编写脚本?

我用来生成 .csv 的代码在这里。抱歉,它可能不是最漂亮的,因为我刚刚开始使用 bash 脚本。

    cd /home/pi/projects/bluetooth_control;
    while true
    do
        echo 'reset hci0';
        sudo hciconfig hci0 down;
        sudo hciconfig hci0 up;
        echo 'timestamp';
        echo `date +%Y-%m-%d.%H:%M:%S` &> test1.csv;
        echo 'running scan';
        (sudo timeout 20 stdbuf -oL hcitool lescan | grep -Eo '(([A-Z]|[0-9]){2}:){5}([A-Z]|[0-9]){2}') &> test.csv;
        echo 'removing duplicates to test.csv';
        (sort test.csv | uniq) >> test1.csv;
        (paste -s test1.csv) >> data.csv;
        echo 'sleep for 60s';
        sleep 60;
    done

【问题讨论】:

    标签: bash csv bluetooth monitor


    【解决方案1】:

    我有时间玩,为了完成答案,这里是我想出的解决方案。我不确定在 Bash 与 Python 中运行它的效率如何,但这里是:

    #!/bin/bash
    cd /home/pi/projects/bluetooth_control;
    while true
    do
    echo 'reset hci0';
    sudo hciconfig hci0 down;
    sudo hciconfig hci0 up;
    echo 'timestamp';
    
    # Create necessary temp files
    echo "temp" &> test1.csv;
    echo `date +%Y-%m-%d.%H:%M:%S` &> test2.csv;
    echo 'running scan';
    
    # Filter out only MAC addresses
    (sudo timeout 20 stdbuf -oL hcitool lescan | grep -Eo '(([A-Z]|[0-9]){2}:){5}([A-Z]|[0-9]){2}') &> /home/pi/projects/bluetooth_control/test.csv;
    echo 'removing duplicates to test.csv';
    
    # Append each unique value to test1.csv
    (sort test.csv | uniq) >> test1.csv;
    
    # For each line in test1.csv, add text to mac_database if it doesn't exist 
    while read line 
        do 
        grep -q -F $line mac_database || echo $line >> mac_database
    done <test1.csv 
    
    # For each line in mac_database, run an if loop
    while read line 
        do 
        # If $line from mac_database exists in test1.csv, then
        if grep -Fxq "$line" test1.csv
            then
                echo '1' >> test2.csv
            else
                echo '0' >> test2.csv
        fi
    done <mac_database
    
    # Convert file to csv format, and append to data.csv
    (paste -s test2.csv) >> data.csv;
    echo 'sleep for 60s';
    sleep 60;
    done
    

    希望这对将来可能选择这样做的人有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-12-04
      • 2017-12-12
      • 2013-07-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-23
      相关资源
      最近更新 更多