2015-12-17 116 views
4

我有一个脚本把时间转换成秒,这样我就可以最终计算出的平均值。我注意到输出线的数量并不等于输入线的数量。事实上,它似乎没有阅读第一行。我简化了代码来检查它,但每次都是一样的。bash脚本无法读取第一行

输入文件是这样的:

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 

我敢肯定,这是愚蠢的东西,但我看不到!

回答

6

你并不需要一个循环。你可以简单地用awk:

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

的理由让你看到的行为是你没有通过line给AWK。所以第一行是读取循环,并由awk在循环内休息,因为awk从循环中获取stdin。因此,你看不到第一行。

如果它仍然是不明确的,只需添加一个echo "Hello"awk打电话给你的循环中,看看它是如何被多次印刷:)

你可能打算这样做:

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

但这只是没有必要的。

+0

谢谢,就是这样 – Lewp1973

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