Умножение всех значений в текстовом файле на другое значение - PullRequest
0 голосов
/ 12 февраля 2019

Моя цель - умножить все значения в текстовом файле на число.В моем случае это 1000.

Исходный текст в файле:

0.00493293814
0.0438981727
0.149746656
0.443125129
0.882018387
0.975789607
0.995755374
1

Я хочу, чтобы вывод выглядел следующим образом: (поэтому, меняя содержимое файла на ...)

4.93293814
43.8981727
149.746656
443.125129
882.018387
975.789607
995.755374
1000

Или даже скорее:

4.9
43.8
149.7
443.1
882.0
975.7
995.7
1000

Я использую bash на macOS в терминале.

Ответы [ 5 ]

0 голосов
/ 13 февраля 2019

Использование num-utils .Для ответов на 8 десятичных разрядов:

numprocess '/*1000/' n.txt

Для округленных ответов на 1 десятичных разрядов:

numprocess '/*1000/' n.txt | numround -n '.1'
0 голосов
/ 13 февраля 2019

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

perl -lpe ' $_=$_*1000 '

с входами и внутренней заменой

$ cat andy.txt
0.00493293814
0.0438981727
0.149746656
0.443125129
0.882018387
0.975789607
0.995755374
1

$ perl -i -lpe ' $_=$_*1000 ' andy.txt

$ cat andy.txt
4.93293814
43.8981727
149.746656
443.125129
882.018387
975.789607
995.755374
1000

$

Одно десятичное место

perl -lpe ' $_=sprintf("%0.1f",$_*1000 ) '

Ноль после запятой и округление

perl -lpe ' $_=sprintf("%0.0f",$_*1000 ) '

Ноль после запятой и усечение

perl  -lpe ' $_=sprintf("%0.0f",int($_*1000) ) ' 
0 голосов
/ 13 февраля 2019

awk на помощь!

$ awk '{printf "%.1f\n", $1*1000}' file > tmp && mv tmp file
0 голосов
/ 13 февраля 2019

Если у вас есть dc:

cat infile | dc -f - -e '1k1000sa[la*Sdz0!=Z]sZzsclZx[Ld1/psblcd1-sc1<Y]sYlYx'
0 голосов
/ 12 февраля 2019

Используйте sed, чтобы поставить перед каждой строкой 1000*, а затем обработать полученные математические выражения с bc.Чтобы отобразить только первую цифру после десятичной точки, вы можете снова использовать sed.

sed 's/^/1000*/' yourFile | bc | sed -E 's/(.*\..).*/\1/'

Это напечатает последние из ваших ожидаемых выходных данных.Как и вы хотели, десятичные дроби вырезаются, а не округляются (1.36 преобразуется в 1.3).

Чтобы удалить все десятичные цифры, замените последнюю … | sed … на sed -E 's/\..*//' или используйте следующую команду

sed 's:^.*$:1000*&/1:' yourFile | bc

С помощью этих команд перезапись файла напрямую невозможна.Вы должны записать во временный файл (добавление > tmp && mv tmp yourFile) или использовать команду sponge из пакета moreutils (добавление | sponge yourFile).

Однако, если вы хотите удалить все десятичные точкипосле умножения есть хитрость.Вместо фактического умножения на 1000 мы можем синтаксически сдвинуть десятичную точку.Это можно сделать одной командой sed.sed имеет опцию -i для перезаписи входных файлов.

sed -i.bak -E 's/\..*/&000/;s/^[^.]*$/&.000/;s/\.(...).*/\1/;s/^(-?)0*(.)/\1\2/' yourFile

Команда изменяет содержимое yourFile на

4
43
149
443
882
975
995
1000

Создается резервная копия yourFile.bak оригинала.

Одиночный sedКоманда также должна работать с любым форматом ввода (даже для таких вещей, как -.1-100).

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