"划分为零" bash / awk中的错误(可能是语法)

时间:2014-12-03 05:59:51

标签: bash shell awk

我有一个.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'}]},

2 个答案:

答案 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'}]},