2013-11-14 74 views
0

我有以下類型的數據文件:與AWK猛砸oneliner在終端運行而不是在腳本

4-11-11 12:59:01,C,26,668 
4-11-11 12:59:31,C,26,668 
4-11-11 13:00:01,C,26,668 
4-11-11 13:00:31,C,26,668 
4-11-11 13:01:01,C,26,668 
4-11-11 13:01:31,C,26,668 

,我想下面的輸出:

12:59:01 26.668 
12:59:31 26.668 
13:00:01 26.668 
13:00:31 26.668 
13:01:01 26.668 
13:01:31 26.668 

這只是正常在下面的行中,但沒有在bash腳本中,它只是給了我一個空文件。在我添加awk部分後,問題就開始了。

cut -d ' ' -f2 $file | cut -d ',' -f-1,3- | awk -f tmp.csv -F"," '{print $1 " " $2 "." $3}' | sed 's/"//' > tmp.csv 
cp tmp.csv > $file 

任何人都可以解釋爲什麼這不會在腳本中工作?

謝謝!

+0

你確定要使用tmp.csv作爲腳本文件AWK和命令的輸出?因爲這是你要求awk/sed做的事情。 –

回答

2

有了這個awk可以更容易:

$ awk -F'[ ,]' '{print $2, $4"."$5}' file 
12:59:01 26.668 
12:59:31 26.668 
13:00:01 26.668 
13:00:31 26.668 
13:01:01 26.668 
13:01:31 26.668 
  • -F'[ ,]'套兩種可能的分隔符:空格和逗號。
  • print $2, $4"."$5根據這些分隔符打印第2,第4和第5個字段。

關於您的腳本無法正常工作的原因,僅僅是因爲您不必要地添加了-f tmp.csv

$ cut -d ' ' -f2 a | cut -d ',' -f-1,3- | awk -F"," '{print $1 " " $2 "." $3}' | sed 's/"//' 
12:59:01 26.668 
12:59:31 26.668 
13:00:01 26.668 
13:00:31 26.668 
13:01:01 26.668 
13:01:31 26.668 

而且你使用-f tmp.csv然後> tmp.csv這沒有任何意義。注意一個文件不能同時用作stdin和stdout。

+0

這很好,謝謝! 出於好奇(爲了避免未來的問題),我仍然想知道爲什麼我的解決方案無法在腳本中工作,有什麼想法? – Xizam

+0

@Xizam剛剛更新。稍做改動(刪除'-f文件')對我有用。查看更新。 – fedorqui

+1

-f tmp.csv實際上並沒有在我試圖在腳本中運行的代碼中,那是由我完成的草率複製。實際的問題在於我很愚蠢地使用「for * .csv中的文件」並將輸出保存到tmp.csv。我還沒有用tmp.csv覆蓋我的原始文件,所以如果腳本不起作用,我就不必複製它們。因此tmp.csv文件被覆蓋爲最後一步,給我一個空文件。 感謝您的幫助。 – Xizam

3

我猜你的腳本環境是罪魁禍首,但整個事情可以只用read來完成:

while IFS=' ,' read a b c d e 
do 
    echo "$b $d.$e" 
done < inputfile 

也許這解決了在不同的級別;-)

2

您的問題不復制臨時文件;你只是刪除你的原始文件。我不知道爲什麼你沒有得到一個錯誤(你應該是,因爲cp需要兩個參數)。

而不是

cp tmp.csh > $file 

使用

cp tmp.csv "$file" 
+0

對。甚至沒有注意到這一點。但我覺得你在這裏找到的錯誤只是在問題中,而不是OP實際使用的腳本(複製/粘貼錯誤)。 – Alfe