【发布时间】:2017-12-17 04:22:15
【问题描述】:
我收集了数据(5000 行 CSV 数据),我想制作一张图表,但出现了问题。在我的匆忙和兴奋中,我忘记了数据收集是什么时候开始的。 Arduino 程序每秒测量一次温度和光照水平(一分钟内更多),并在该观察结果上标记一个相对时间戳。时间戳是程序启动后的毫秒数。
幸运的是,由于文件上的 Linux 时间戳,我也知道程序结束的时间。所以从结束时间倒推,我就能得到开始时间。
这是开始的数据:(使用 head 命令)
10510707,PV1,1,753.00,PV2,2,129.00,TS1,5,114.13,TS2,7,97.70,WWVB,0,213.00
10512621,PV1,1,753.00,PV2,2,130.00,TS1,5,114.57,TS2,7,97.70,WWVB,0,212.00
10514536,PV1,1,752.00,PV2,2,128.00,TS1,5,114.69,TS2,7,97.70,WWVB,0,212.00
10516450,PV1,1,752.00,PV2,2,129.00,TS1,5,114.80,TS2,7,97.70,WWVB,0,211.00
这是结束数据(使用 tail 命令)
20067422,PV1,1,700.00,PV2,2,89.00,TS1,5,117.39,TS2,7,96.80,WWVB,0,198.00
20069336,PV1,1,700.00,PV2,2,90.00,TS1,5,116.94,TS2,7,96.80,WWVB,0,198.00
20071248,PV1,1,700.00,PV2,2,90.00,TS1,5,116.94,TS2,7,96.80,WWVB,0,198.00
20073161,PV1,1,700.00,PV2,2,90.00,TS1,5,116.94,TS2,7,96.80,WWVB,0,198.00
根据我的计算,第一行的时间戳应该是:
Mon Aug 21 13:04:42 EDT 2017,10510707,PV1,1,753.00,PV2,2,129.00,TS1,5,114.13,TS2,7,97.70,WWVB,0,213.00
最后一行的时间戳应该是:
Mon Aug 21 15:44:04 EDT 2017,20073161,PV1,1,700.00,PV2,2,90.00,TS1,5,116.94,TS2,7,96.80,WWVB,0,198.00
听到我正在处理的脚本:
#!/bin/bash
while IFS='' read -r line || [[ -n "$line" ]]; do
#step 1. Get the very first millisecond value in a variable
VarFirstMilliSeconds=$ cat newberry_subset.csv | awk -F, '{print $1}'
#Subsequent Milliseconds
VarMilliSeconds=$(echo "$line" |cut -d "," -f 1)
#declaration of 1 second
declare -i x=1000
#August 21 2017 converted into epoch date
VarFirstDate=$(date -j -f "%d-%B-%y" 21-AUG-17 +%s)
# First millisecond time - current milliseconds
VarDifferenceOfMilliSeconds=$(expr "$VarFirstMilliSeconds"-"$VarMilliSeconds")
# Calculated difference of first milliseconds and current milliseconds divide
by 1000
# to get seconds to add to epoch date
VarDifferenceOfSeconds=$(expr "$VarDifferenceOfMilliSeconds"/"$x")
# epoch date with difference of first date and current milliseconds added
NewEpochDate=$(expr "$VarFirstDate"+"$VarDifferenceOfSeconds")
# converted epoch date to human readable format
ConvertedEpochDate=$(echo "$NewEpochDate" | awk '{ print strftime("%c", $1);
}')
LineWithOutMili=$(echo "$line" | cut -d "," -f 2-16)
ConvertedEpochTime=$(echo "$ConvertedEpochDate" | cut -d " " -f 4 | cut -d ":"
-f 1-2)
echo "$ConvertedEpochTime,$LineWithOutMili"
done < "$1"
问题是当我运行脚本时它没有连接变量并且生成 csv 需要很长时间
【问题讨论】:
-
您想对文件中的所有第一列都执行此操作吗?还是只有第一行和最后一行?
-
文件中的所有第一列。我也愿意使用 awk
-
第一列的值是什么?
20067422不是 EPOCH 时间。你为什么在日期命令中硬编码21-AUG-17 -
这在第 1 步中中断。您需要在整个命令周围使用
$( ),而不仅仅是在开始时使用$。 -
@Inian : 第一个 col 值是“他的时间戳是程序启动后的毫秒数。” (如第一段所述);-) 祝大家好运!