Как мы можем преобразовать значения дальтона в kilodalton при помощи команд оболочки? У меня есть список значений в дальтонах. В kilodalton существует 1 000 дальтонов, таким образом, необходимо разделить каждое значение на тысячу.
Демонстрационные данные:
12345.09
236575.665
18865.41
45678.87
Желаемый вывод:
12.34509
236.575665
18.86541
45.67887
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
метод, и т.п.
Предполагает, что числовое значение хранится в переменной 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
$
Этот небольшой сценарий был бы полезен:
#!/bin/bash
values="$1"
echo "Source of values: $values"
while read -e name; do
results=$(bc <<< "scale=4; ($name/1000)")
echo "$results"
done < "$values"
Использование:
исполняемый файл Make-файла с:
chmod u+x dalton.sh
Выполнение и передача в пути к файлу данных или имени файла:
./dalton.sh data.txt
Давайте предположим, что у Вас есть текстовый файл, названный daltons
, например, со всеми числовыми значениями, которые Вы хотите преобразовать в отдельном столбце.
awk '{kDa=$1/1000; print kDa}' daltons >> result
то, Где kDa
переменная для хранения операции, и $1
, примет каждое из значений строки. Наконец, результаты хранятся в файле result
.
Я просто использовал бы 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