2015-12-17 119 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