将数字转换为CSV格式文件中的科学计数法

时间:2018-07-04 06:22:36

标签: python bash awk sed

我有一个csv文件,其标题包含每列的标题。我想将所有数字转换为只有2位小数的科学计数法格式。即23452应转换为2.34e + 04,而0.00023452应转换为2.34e-04。

但是,我希望第一列保持不变。它的格式为text_number,例如ABC_100。我不希望ABC_100转换为ABC_1e + 2。

简而言之,我想保留第一列和第一行,然后将所有内容更改为两位十进制科学格式。

示例文件:

Name,ClassA,ClassB,ClassC
File_10,2342,0.0212,34.234
File_50,43.234,7834,0.0024
File_100,300,0.0024,2.2341e-5 

预期输出:

Name,ClassA,ClassB,ClassC
File_10,2.34e+03,2.12e-02,3.42e+01
File_50,4.3e+01,7.83e+03,2.4e-03
File_100,3e+02,2.4e-03,2.23e-5 

3 个答案:

答案 0 :(得分:0)

你在这里。

awk -F, 'NR == 1 {print}
  NR > 1 {
    printf $1;
    for (ii = 2; ii <= NF; ii++){
      printf(",%1.2e", $ii)
    }
    print ""}' input.txt

reference for printf可能派上用场。

答案 1 :(得分:0)

另一个awk:

$ awk '
BEGIN { FS=OFS="," }                # set field separators
{
    for(i=1;i<=NF;i++)              # iterate all fields
        if($i+0==$i)                # if $i is numeric
            $i=sprintf("%1.2e",$i)  # convert to scientific form
}
1' file                             # output
Name,ClassA,ClassB,ClassC
File_10,2.34e+03,2.12e-02,3.42e+01
File_50,4.32e+01,7.83e+03,2.40e-03
File_100,3.00e+02,2.40e-03,2.23e-05

答案 2 :(得分:0)

使用GNU awk,基于@JamesBrown答案(用于检测数字),又一个awk,没有任何循环:

awk '
BEGIN{RS="[,\n]"}
$1+0==$1{$1=sprintf("%1.2e",$1)}
{printf "%s%s",$0,RT}' file

记录分隔符RS允许将每个数字作为一条记录捕获,因此避免使用任何循环。