Linux 无法连接bash变量

Linux 无法连接bash变量,linux,bash,csv,awk,Linux,Bash,Csv,Awk,我收集了数据(5000行CSV数据),我想制作一个图表,但有一个问题。在匆忙和兴奋中,我忘记了记录数据收集是何时开始的。Arduino程序每秒测量一次温度和光照水平(一分钟内测量更多),并在观测上标记一个相对时间戳。时间戳是程序启动后的毫秒数。 幸运的是,由于文件上的Linux时间戳,我还知道程序结束的时间。因此,从结束时间向后工作,我能够得到开始时间 以下是开始数据:(使用head命令) 这是结束数据(使用tail命令) 根据我的计算,第一行上的时间戳应该是: Mon Aug 21 13:04

我收集了数据(5000行CSV数据),我想制作一个图表,但有一个问题。在匆忙和兴奋中,我忘记了记录数据收集是何时开始的。Arduino程序每秒测量一次温度和光照水平(一分钟内测量更多),并在观测上标记一个相对时间戳。时间戳是程序启动后的毫秒数。 幸运的是,由于文件上的Linux时间戳,我还知道程序结束的时间。因此,从结束时间向后工作,我能够得到开始时间

以下是开始数据:(使用head命令)

这是结束数据(使用tail命令)

根据我的计算,第一行上的时间戳应该是:

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
最后一行上的时间戳应为:

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
hear是我正在编写的脚本:

#!/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"
#/bin/bash
而IFS=''读-r行| |[[-n“$line”];做
#第一步。获取变量中的第一个毫秒值
varfirstMillistics=$cat newberry_subset.csv | awk-F,“{print$1}”
#后续毫秒
varms=$(回显“$line”| cut-d”、“-f1)
#声明1秒
声明-IX=1000
#2017年8月21日转换为划时代日期
VarFirstDate=$(日期-j-f“%d-%B-%y”17年8月21日+%s)
#第一毫秒时间-当前毫秒
vardifferenceofmillseconds=$(expr“$varfirstmillists”-“$varmillists”)
#计算出的第一个毫秒与当前毫秒之差除以
千
#获取要添加到历元日期的秒数
VarDifferenceOfSeconds=$(expr“$vardifferenceofmillseconds”/“$x”)
#添加了第一个日期和当前毫秒差的历元日期
NewEpochDate=$(expr“$VarFirstDate”+“$VarDifferenceOfSeconds”)
#将历元日期转换为人类可读的格式
ConvertedEpochDate=$(echo“$NewEpochDate”| awk'{print strftime(“%c”,$1);
}')
不带MILI的线条=$(回显“$线条”|切割-d”,“-f 2-16)
ConvertedEpochTime=$(回显“$ConvertedEpochDate”| cut-d”“-f4 | cut-d”:
-f 1-2)
echo“$ConvertedEpochTime,$LineWithOutMili”
完成<“$1”

问题是,当我运行脚本时,它没有连接变量,并且需要很长时间才能生成csv。您可以在一个
Awk
命令中完成这一切。除了修复原始
bash
脚本中的几个语法问题之外

作为第一步,在shell变量中获取以历元为单位的原点时间,然后在
Awk
中使用该时间在第一个字段上进行后续转换。我使用了
FreeBSD
版本的
date
命令,看到您使用了相同的命令

origin=$(date -j -f "%a %b %d %T %Z %Y" "Mon Aug 21 13:04:42 EDT 2017" +%s)
现在,我们将使用
origin
变量,并按如下所示进行所需的计算

awk -v start="$origin" 'BEGIN{FS=OFS=","}{delta=sprintf("%.0f", (start - ($1/1000))); $1=strftime("%a %b %e %H:%M:%S %Z %Y",delta)}1' csv_file
或者,如果您希望将时间戳作为一个新列包含,并让以前的所有列也包含在内

awk -v start="$origin" 'BEGIN{FS=OFS=","}{delta=sprintf("%.0f", (start - ($1/1000))); print strftime("%a %b %e %H:%M:%S %Z %Y",delta),$0}' csv_file

要在文件的所有第一列中执行此操作吗?还是仅第一行和最后一行?文件中的所有第一列。另外,我也愿意使用AWK,第一列的值是什么<代码>20067422不是一个纪元时间。为什么要在日期命令中硬编码
2017年8月21日
,此操作在步骤1中中断。整个命令需要
$()
,而不仅仅是开始时的
$
。@Inian:first col值是“时间戳是程序启动后的毫秒数”。(如第一段所述);-)祝大家好运!您应该提到的是,gawk仅适用于
strftime()
,因为您使用的是gawk,所以不需要外部
date
调用,只需使用
BEGIN{…;start=mktime(“2017 08 21 13 04 42”)}
。非常感谢,请问有没有办法在PV1之前删除原始csv文件的第一列,在单个awk脚本中(对于更干净的脚本)