Bash脚本无法读取第一行

4
我有一个将时间戳转换为秒的脚本,以便最终计算平均值。我注意到输出行数与输入行数不相等。实际上,它似乎没有读取第一行。我简化了代码进行检查,但每次结果都是一样的。
输入文件如下所示:
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个回答

6

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

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

您看到的行为原因是您没有将 line 传递给 awk。因此,第一行由循环中的read读取,其余由循环内的 awk 读取,因为 awk 从循环得到它的 stdin。因此,您看不到第一行。
如果还不清楚,请在循环内的 awk 调用 后面添加一个echo "Hello" ,并查看它被打印了多少次:)
您可能打算执行以下操作:
echo $line | awk -F: '{ print $1, $2, $3 }' > /home/time.log

但这是不必要的。


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

在这里,你还可以充分利用tr

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

它将为您提供所需字符的翻译。例如:
$ tr ':' ' ' <dat/timestamp.log
00 00 01
00 00 02
00 00 03

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接