bash脚本无法读取第一行

时间:2015-12-17 17:46:31

标签: bash awk

我有一个脚本将时间戳转换为秒,这样我最终可以算出平均值。我注意到输出行的数量不等于输入行的数量。实际上它似乎没有阅读第一行。我简化了代码来检查它,但每次都是一样的。

输入文件如下所示:

00:00:01
00:00:02
00:00:03

输出如下:

00 00 02
00 00 03

这是剧本:

#!/bin/bash

while read line
do
    awk -F: '{ print $1, $2, $3 }' > /home/time.log

done < /home/timestamp.log

我确定这是愚蠢的但是我看不到它!

3 个答案:

答案 0 :(得分:6)

您不需要循环。你可以简单地使用awk:

awk -F: '{ print $1, $2, $3 }' /home/timestamp.log > /home/time.log

您看到的行为的原因是您没有将line传递给awk。所以第一行是由读取循环读取的,并且当awk从循环中获取 stdin 时,由循环内的awk休息。因此,你没有看到第一行。

如果仍然不清楚,只需在循环中 echo "Hello"调用后添加awk ,看看它打印的次数:)

您可能打算这样做:

echo $line | awk -F: '{ print $1, $2, $3 }' > /home/time.log

但这只是不必要的。

答案 1 :(得分:3)

read line消耗输入的第一行,并将其分配给Bash变量$line,然后忽略该变量。然后循环体正在使用awk处理文件的其余部分。

您可以直接使用awk而无需循环:

awk -F: '{ print $1, $2, $3 }' /home/timestamp.log > /home/time.log

或者您可以使用循环而不是awk:

while IFS=: read h m s; do echo $h $m $s >> /home/time.log; done < /home/timestamp.log

答案 2 :(得分:2)

您也可以在此处使用tr

tr ':' ' ' < /home/timestamp.log

它将提供您需要的字符翻译。 E.g:

$ tr ':' ' ' <dat/timestamp.log
00 00 01
00 00 02
00 00 03