Существует файл, который я имею который взгляд
555.92 569.472 582.389 648.078 999.702 1040.75 1386.24 1418.47 1998.26 2182.13 2384.3
Мне было бы нужно к раунду каждое число как это
556 569 582
Идеально я не должен создавать tmp файл. Как сделать это?
Выполните содержание файла через функцию printf.
$ xargs -a numbers.txt -n1 printf "%1.f "
556 569 582 648 1000 1041 1386 1418 1998 2182 2384
кроме того, Ubuntu имеет миленькую программу, названную numfmt
, который позволяет форматировать числа к определяемым пользователем стандартам, и человекочитаемый.
, Например,
$ xargs -a numbers.txt -n1 numfmt --to=si --round=up | xargs echo
556 570 583 649 1.0K 1.1K 1.4K 1.5K 2.0K 2.2K 2.4K
Проверка man numfmt
для большего количества информации
Другое решение для Python (одно - лайнер). Выполненный в терминале:
python3 -c "[print(round(float(n))) for n in open('f').read().split()]"
, Где 'f'
исходный файл с Вашими плаваниями, между одинарными кавычками, например:
python3 -c "[print(round(float(n))) for n in open('/home/jacob/Bureaublad/test').read().split()]"
Вывод:
556
569
582
648
1000
1041
1386
1418
1998
2182
2384
, Если Вы хотели бы числа в одной строке:
python3 -c "[print(round(float(n)), end=' ') for n in open('f').read().split()]"
(Спасибо @Oli!)
Вывод:
556 569 582 648 1000 1041 1386 1418 1998 2182 2384
команда:
python3 -c "[print(round(float(n))) for n in open('f').read().split()]"
в разделах:
open('f').read().split()
чтения файл 'f'
, разделения это в плавания (теперь все еще как строка)
round(float(n))
Первый интерпретирует строка n
, поскольку плавание, раунды это к целому числу
[print(round(float(n))) for n in open('f').read().split()]
наконец, генерирует команду печати, для печати всех округленных плаваний.
Используя python
:
#!/usr/bin/env python2
with open('/path/to/file.txt') as f:
for line in f:
numbers = line.strip().split(' ')
for num in numbers:
print int(round(float(num))),
список numbers
будет содержать все числа, которым досаждают на пробелах (line.rstrip().split(' ')
)
Тогда, мы использовали эти round()
функция к раунду числа с плавающей точкой
, Поскольку исходные данные хранятся как srings, мы должны использовать эти float()
функция для преобразования их в плавания
Эти int()
, функция распечатает число, отбрасывая десятичные точки т.е. только целочисленную часть
Вывод:
556 569 582 648 1000 1041 1386 1418 1998 2182 2384
Где awk
версия? printf
может также использоваться в awk
:
awk '{for(i=1;i<=NF;i++) {printf "%0.f ",$i} printf "\n"}'
или оперативный без временного файла (Спасибо @muru)
awk -i inplace '{for(i=1;i<=NF;i++) {printf "%0.f ",$i} printf "\n"}'
<час> Пример
% cat foo
555.92 569.472 582.389 648.078 999.702 1040.75 1386.24 1418.47 1998.26 2182.13 2384.3
% awk '{
for(i=1;i<=NF;i++) {
printf "%0.f ",$i
}
printf "%s","\n"
}' foo
556 569 582 648 1000 1041 1386 1418 1998 2182 2384
bash
может только обработать целочисленную арифметику. Используйте более мощный язык, например, Perl:
perl -ane 'printf "%.0f ", $_ for @F' file
-n
читает вход линию за линией-a
разделения каждая строка на пробеле к @F
массив%.0f
формат потока с нулевыми цифрами после десятичной точкиИспользуя perl
:
perl -ne 'printf("%.0f ", $_) for split' file
Это должно работать на Вас:
perl -ne '@l=split(/\s+/,$_); foreach(@l){printf("%.0f",$_); print " "}'
можно использовать его как
echo "555.92 569.472 582.389" | perl -ne '
@l=split(/\s+/,$_);
foreach(@l) {
printf("%.0f",$_);
print " "
}'