Преобразуйте значения от дальтона до kilodalton (Разделите значения на 1 000),

Как мы можем преобразовать значения дальтона в kilodalton при помощи команд оболочки? У меня есть список значений в дальтонах. В kilodalton существует 1 000 дальтонов, таким образом, необходимо разделить каждое значение на тысячу.

Демонстрационные данные:

12345.09
236575.665
18865.41
45678.87

Желаемый вывод:

12.34509
236.575665
18.86541
45.67887
5
задан 26 September 2017 в 01:29

5 ответов

С awk

Задача здесь состоит в том, чтобы просто разделить каждое значение на тысячу. Существует несколько хороших способов сделать это - на всех значениях в Вашем файле - только с единственной командой. Предположим, что Ваши числа находятся в названном файле dalton.txt и, как в примере Вы показали, одно значение на строку. Вот один путь, с помощью AWK:

awk '{ print $0 / 1000.0 }' dalton.txt

Это воздействует на каждую строку. $0 в AWK указывает на целую строку. Как записано это производит к Вашему терминалу, но можно перенаправить вывод в файл. Это отправляет вывод в kilodalton.txt (перезапись его, если это уже существует):

awk '{ print $0 / 1000.0 }' dalton.txt > kilodalton.txt

Однако можно хотеть настроить точность. Учитывая пример вводит Вас, показал нам, вывод к Вашему терминалу или файлу от использования тех команд:

12.3451
236.576
18.8654
45.6789

Ваш выходной пример, каждое выходное значение сохраняет ту же точность (с точки зрения количества цифр показанной информации) как соответствующее входное значение. Если Вы хотите это:

awk '{ printf "%.*g\n", length($0), $0 / 1000.0 }' dalton.txt

Это все еще усекает конечные нули после десятичной точки, так как это то, как printf функция g спецификатор формата ведет себя. (Ваши примеры не ясно дают понять, хотите ли Вы это.) Способ, которым это работает, состоит в том, чтобы просто указать точность, которая всегда, по крайней мере, так же высока как количество цифр во входе, но создание его общая длина входной строки, length($0).

Та команда может, конечно, также быть перенаправлена в файл, и его вывод является точно выводом, показанным в Вашем вопросе:

12.34509
236.575665
18.86541
45.67887

Часто можно хотеть указать ту же точность для каждой записи, или как общее количество показанных чисел или как количество шоу чисел после десятичной точки. Например, чтобы показать в общей сложности 6 числам для каждого значения (первая строка будет 12.3451), используйте:

awk '{ printf "%.6g\n", $0 / 1000.0 }' dalton.txt

Или показать 3 числам после десятичного разряда для каждого значения (первая строка будет 12.345) использование:

awk '{ printf "%.3f\n", $0 / 1000.0 }' dalton.txt

Хотя возможно записать цикл в сценарии оболочки, который считывает данные, это более сложно, и это - редко лучший подход, когда простая команда сделает это для Вас. Даже если это уже - часть большего сценария оболочки, оболочки являются языками связующего звена, которые предназначены, чтобы использоваться для вызова независимо от того, что инструменты подходят лучше всего для задачи. Таким образом, я предлагаю использовать это awk метод, превосходный terdon's perl метод, и т.п.

15
ответ дан 23 November 2019 в 08:35

Общее описание

Предполагает, что числовое значение хранится в переменной dalton. Затем это работает со значениями, которые являются достаточно большими для создания ненулевых значений с простой конструкцией $(()).

Пример:

$ dalton=3800
$ echo $(($dalton/1000))
3

Для получения корректного округления к ближайшему целому числу

$ echo $(( ($dalton+500)/1000 ))
4

у Вас есть больше функций, если Вы устанавливаете bc.

sudo apt-get install bc

$ bc
bc 1.06.95
Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006 Free Software Foundation, Inc.
This is free software with ABSOLUTELY NO WARRANTY.
For details type `warranty'. 
scale=3                        # set the number of decimals
dalton=3800
dalton/1000
3.800
(dalton+0,5)/1000
(standard_in) 4: syntax error  # use decimal point (not comma)
(dalton+0.5)/1000              # add 0.5 to get correct rounding
3.800
dalton=3800.8
(dalton+0.5)/1000
3.801
dalton=3800.2
(dalton+0.5)/1000
3.800
quit
$ 

В сценарии оболочки можно передать вход по каналу в до н.э как так,

echo "scale=3
($dalton+0.5)/1000" | bc

, Который может быть протестирован в интерактивном режиме также,

$ dalton=3800.8
$ echo "scale=3
($dalton+0.5)/1000" | bc
3.801
$

, Сценарий оболочки

Создает сценарий оболочки с именем converter

#!/bin/bash

dalton=

function convert2kilo {

 echo "scale=6
 ($dalton+0.0005)/1000" | bc 
}
########################################################################

# main

########################################################################

while read dalton
do
 convert2kilo
done

, и входной файл с именем input.data

12345.09
236575.665
18865.41
45678.87
1.0008
1.0002

Делают исполняемый файл сценария оболочки

chmod ugo+x converter

Выполнение сценарий оболочки

$ < input.data ./converter 
12.345090
236.575665
18.865410
45.678870
.001001
.001000
$ 
6
ответ дан 23 November 2019 в 08:35

Этот небольшой сценарий был бы полезен:

#!/bin/bash    

values="$1"

echo "Source of values: $values"

while read -e name; do            

        results=$(bc <<< "scale=4; ($name/1000)")
        echo "$results"

done < "$values"

Использование:

  1. исполняемый файл Make-файла с:

    chmod u+x dalton.sh
    
  2. Выполнение и передача в пути к файлу данных или имени файла:

    ./dalton.sh data.txt
    
3
ответ дан 23 November 2019 в 08:35

Давайте предположим, что у Вас есть текстовый файл, названный daltons, например, со всеми числовыми значениями, которые Вы хотите преобразовать в отдельном столбце.

awk '{kDa=$1/1000; print kDa}' daltons >> result

то, Где kDa переменная для хранения операции, и $1, примет каждое из значений строки. Наконец, результаты хранятся в файле result.

1
ответ дан 23 November 2019 в 08:35

Я просто использовал бы perl:

$ perl -lne 'print $_/1000' file
12.34509
236.575665
18.86541
45.67887

Или awk:

$ awk '{printf "%.6f\n", $1/1000}' file
12.345090
236.575665
18.865410
45.678870
12
ответ дан 23 November 2019 в 08:35

Другие вопросы по тегам:

Похожие вопросы: