2013-07-02 39 views
2

我有一個文件包含許多行數據,如下所示。四捨五入到小數點後重新排列文件的列值

$cat out.txt 

342000,0,6.768619883040936,5.834888120763486,12211.2329060592,14437.0 
342001,1,7.768619883040937,6.834888120763487,12212.2329060593,14438.1 
........ 
........ 

我需要重新格式化數據,如下所示並更新相同的文件。

342000,0,6.769,5.835,12211,14437 
342001,1,7.769,6.835,12212,14438 

必需;

  1. 列圓的3個值至3個小數
  2. 第4倍的值輪3個小數
  3. 四捨五入小數爲列5個值
  4. 四捨五入小數爲第6倍的值

欣賞您的支持

回答

3

您可以使用awkprintf,如下所示:

$ awk -F, '{printf("%d,%d,%.3f,%.3f,%.0f,%.0f\n",$1,$2,$3,$4,$5,$6)}' file 
342000,0,6.769,5.835,12211,14437 
342001,1,7.769,6.835,12212,14438 
+0

這是工作很好。感謝您的支持 – Isuru

+0

給他人的提示:如果你的字段沒有被''分開,那麼省略'-F,' –

1

如果你想在bash完全做到這一點(printf是一個內置的),你可以做這樣的事情:

#!/bin/bash 

IN=$1 

(
    IFS=',' 
    while read line ; do 
     set $line XXX 
     if [ $1 != "XXX" ] ; then 
      printf "%d,%d,%.3f,%.3f,%.0f,%.0f\n" "$1" "$2" "$3" "$4" "$5" "$6" 
     fi 
    done 
) < $IN 
+0

這很好用。感謝您的支持。順便說一句,我已經使用awk解決方案,因爲它對我來說很方便(單個班輪)。 – Isuru

1

這可以簡化,同時注意設置小數點分隔符的正確的語言環境。

export LANG=C 

,你可以做這樣的事情(知道格式是固定的輸入)

IFS="," 
while read line;do printf "%d,%d,%.3f,%.3f,%.0f,%.0f\n" $line ; done < out 
+0

這很好。感謝您的支持。順便說一句,我已經使用awk解決方案,因爲它對我來說很方便(單個班輪)。 – Isuru