Преобразование чисел в научные обозначения в файле формата CSV - PullRequest
0 голосов
/ 04 июля 2018

У меня есть CSV-файл с заголовком, содержащим заголовок каждого столбца. Я хочу преобразовать все числа в научный формат записи только с двумя десятичными знаками. то есть 23452 следует преобразовать в 2,34e + 04 и 0,00023452 в 2,34e-04.

Однако я хочу, чтобы первый столбец оставался нетронутым. Он имеет форму text_number, например, для ABC_100. Я не хочу, чтобы ABC_100 был преобразован в ABC_1e + 2.

Проще говоря, оставляя первый столбец и первый ряд, я хочу, чтобы все изменилось на 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 голосов
/ 04 июля 2018

Еще в 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
0 голосов
/ 04 июля 2018

Еще один awk, основанный на ответе @JamesBrown (для определения числа), с использованием GNU awk, без какого-либо цикла:

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

Разделитель записей RS позволяет перехватывать каждое число как одну запись, поэтому избегайте использования циклов.

0 голосов
/ 04 июля 2018

Вот, пожалуйста.

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

Справка для printf может пригодиться.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...