簡體   English   中英

無法連接bash變量

[英]Unable to concatenate bash variables

我收集了數據(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命令中完成所有操作。 除了在原始bash腳本中修復一些語法問題。

作為第一步,在shell變量中獲取EPOCH中的原始時間,然后在Awk使用它來進行第一個字段的后續轉換。 我已經使用了date命令的FreeBSD版本,看到你使用了相同的版本。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM