我有一个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
答案 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
允许将每个数字作为一条记录捕获,因此避免使用任何循环。