[英]bash script fails to read first line
我有一个脚本将时间戳转换为秒,所以我最终可以计算平均值。 我注意到输出行的数量不等于输入行的数量。 实际上它似乎没有阅读第一行。 我简化了代码来检查它,但每次都是一样的。
输入文件如下所示:
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
我确定这是愚蠢的,但我看不到它!
你不需要循环。 你可以简单地使用awk:
awk -F: '{ print $1, $2, $3 }' /home/timestamp.log > /home/time.log
您看到的行为的原因是您没有将该line
传递给awk。 所以读取循环读取第一行,并在循环中通过awk休息,因为awk从循环中获取stdin 。 因此,你没有看到第一行。
如果它仍然不清楚,只需在循环中的awk
调用后添加一个echo "Hello"
,看看它被打印多少次:)
你可能打算这样做:
echo $line | awk -F: '{ print $1, $2, $3 }' > /home/time.log
但这只是不必要的。
read line
消耗输入的第一行,并将其分配给Bash变量$line
,然后忽略该$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
你也可以在这里使用tr
:
tr ':' ' ' < /home/timestamp.log
它将提供您需要的字符翻译。 例如:
$ tr ':' ' ' <dat/timestamp.log
00 00 01
00 00 02
00 00 03
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.