我有一个.tsv文件,它随着数据不断更新(即每5分钟一次)。我正在尝试编写一个shell脚本,该脚本在执行时会识别它尚未看到的.tsv文件中的行,操作每一行,并将新行追加到另一个文件中。
之前我只做了很少的shell脚本,这是我第一次使用awk
,它正在进行大部分实际的数据处理。
当我尝试运行脚本时,出现此错误:line 21: 0 /var/www/processed-temp-data: division by 0 (error token is "/www/processed-temp-data")
第21行是我调用awk
的地方:
awk -v awkLINES=$((LINES+1)) -v q="'" 'function CtoF(tempC)
{
1.8 * tempC + 32
}
function make-dTime(tsvTime)
{
split(tsvTime, dTime, /:_-/, seps)
jsMonth = dTime[2] - 1
dTime[1] ", " jsMonth ", " dTime[3] ", " dTime[4] ", " dTime[5] ", " dTime[6]
}
# skips past the lines already in output file
NR <= awkLINES { next }
# formats data
{ print "{c:[{v: new Date(" make-dTime($1) ")}, {v: q" CtoF($2) $2 "q}, {v: q" $3 "q}]},"
}' /home/pi/dht-temp-log.tsv >>/var/www/processed-temp-data
由于我根本不想进行任何分工,显然有些事情出了问题。我希望我在引用或转义序列等方面犯了一些错误,但是我一直在努力确定什么是非常糟糕的。非常感谢帮助。
ETA
输入行看起来像:
2014-12-22_14:35:08 27.5 14.1
那应该转换为
{c:[{v: new Date(2014, 11, 22, 14, 25, 08)}, {v: '81.5'}, {v: '27.5'}, {v: '14.1'}]},
答案 0 :(得分:2)
您指出的第21行调用awk
命令。 awk -v
将变量作为参数,并在程序开始执行之前将值赋给变量。请参阅awk man page。这里可能发生的是你的变量awkLINES得到一个类似0 /var/www/processed-temp-data
的值,系统正试图评估它。表达式清楚地表明0被除以下面的表达式。因此,“除以零”错误。
答案 1 :(得分:2)
这个awk脚本应该可以工作:
awk -v awkLINES=0 -v q="'" 'function CtoF(tempC) {
return 1.8 * tempC + 32
}
function make_dTime(tsvTime) {
split(tsvTime, dTime, /[:_-]/)
jsMonth = dTime[2] - 1
return dTime[1] ", " jsMonth ", " dTime[3] ", " dTime[4] ", " dTime[5] ", " dTime[6]
}
# skips past the lines already in output file
# formats data
NR > awkLINES {
print "{c:[{v: new Date(" make_dTime($1) ")}, {v: "q CtoF($2) q "}, {v: " q $2 q "}, {v: "q $3 q "}]},"
}' /home/pi/dht-temp-log.tsv
<强>输出:强>
{c:[{v: new Date(2014, 11, 22, 14, 35, 08)}, {v: '81.5'}, {v: '27.5'}, {v: '14.1'}]},