Как делают меня круглые числа к ближайшему целому числу из командной строки?

Существует файл, который я имею который взгляд

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 файл. Как сделать это?

5
задан 23 June 2015 в 06:59

7 ответов

Выполните содержание файла через функцию 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 для большего количества информации

10
ответ дан 23 November 2019 в 08:38

Другое решение для 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()]

наконец, генерирует команду печати, для печати всех округленных плаваний.

5
ответ дан 23 November 2019 в 08:38

Используя 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
4
ответ дан 23 November 2019 в 08:38

Где 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
3
ответ дан 23 November 2019 в 08:38

bash может только обработать целочисленную арифметику. Используйте более мощный язык, например, Perl:

perl -ane 'printf "%.0f ", $_ for @F' file
  • -n читает вход линию за линией
  • -a разделения каждая строка на пробеле к @F массив
  • %.0f формат потока с нулевыми цифрами после десятичной точки
5
ответ дан 23 November 2019 в 08:38

Используя perl:

perl -ne 'printf("%.0f ", $_) for split' file
2
ответ дан 23 November 2019 в 08:38

Это должно работать на Вас:

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 " "
  }'
2
ответ дан 23 November 2019 в 08:38

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

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