Как рассчитать, взяв первое поле

Я пытаюсь сделать такой расчет, у меня есть текстовый файл с такими цифрами, как

459 455 463 

И я должен рассчитать процент этих чисел относительно 600. Я имею в виду точно

(459/600)*100 который будет моим процентом, 459 получается из текстового файла.

Может ли кто-нибудь помочь мне, пожалуйста?

  • Как пропустить подкаталоги в цикле for, основанном только на имени?
  • Файлы tar для Linux менее 3 месяцев назад, используя дату в filename
  • Как увеличить количество предыдущего командного текста bash будет прокручиваться до?
  • Основное поведение bash
  • Как Bash обрабатывает командную строку?
  • bash заменить массив с именем var с другим массивом
  • Может ли кто-нибудь сказать мне, что случилось с этим скриптом unix?
  • Как передать переменную в параллельный скрипт из текстового файла по строкам
  • 6 Solutions collect form web for “Как рассчитать, взяв первое поле”

    ОК, теперь квинеон изменился почти полностью ^^ Теперь вам нужно рассчитать, заданные числа, сколько% они представляют относительно числа 600.

    Вот пересмотренная версия.

    Я дал свой старый ответ ниже по исторической причине ^^

    новый ответ:

     awk ' { printf "%s %.2f%\n",$1,($1/600)*100; }' numbers.txt 

    т.е. если файл «numbers.txt» содержит только 1 столбец с числом от 0 до 600, он просто печатает номер, а в следующем столбце -%, который он представляет в отношении 600. Я мог бы просто получить второй расчет как ( $ 1/6) «%», но это, на мой взгляд, вывело бы важную информацию из сценария.

    на вашем новом примере данные, которые он теперь выводит:

     459 76.50% 455 75.83% 463 77.17% 

    старый ответ:

    Если вам действительно нужно рассчитать процент , то это будет примерно так:

     awk ' { # each line is read and stored, and the sum is computed also. original[NR]=$0 ; #store the current line (line NR) in the "original[]" tab sum+=$1 ; #and compute the sum of the 1st column } END { #at the END, ie after we processed the whole file for(line=1;line<=NR;line++) { printf "%s %.2f%\n",original[line],original[line]/sum*100 ; } } ' numbers.txt 

    что-то вроде этого должно вычислять% и помещать его рядом с номером (с двумя дробными цифрами)

    на вашем примере он выводит:

     12 5.36% 23 10.27% 35 15.62% 67 29.91% 87 38.84% 

    Если ваш файл на самом деле представляет собой список чисел, по одному в строке, выполните следующие действия:

     awk '{print $1,$1"%"}' numbers.txt 

    или, в sed :

     sed -r 's/(.+)/\1 \1%/' numbers.txt 
     $ paste -d' %' numbers.txt numbers.txt /dev/null 12 12% 23 23% 35 35% 67 67% 87 87% 

    -d принимает несколько разделителей: пробел и проценты здесь

    То же, что и @ slm's, просто используя класс символов:

     $ sed -r 's/([[:digit:]]+)/\1 \1%/g' numbers.txt 

    Это можно сделать с помощью sed .

    Если номера упорядочены:

     12 23 35 67 87 

    пример

     $ sed 's/\([0-9]\+\)/\1 \1%/g' somefile.txt 12 12% 23 23% 35 35% 67 67% 87 87% 

    Детали

    1. Мы используем способность sed искать и заменять ( s/../../g ).
    2. \([0-9]\+\) соответствует любой последовательности чисел (12, 23, ..). Параны вокруг этого сохраняют эти результаты во временной переменной ( \1 ).
    3. Каждый раз, когда мы находим совпадающую последовательность чисел, мы заменим ее на себя и другую копию самого себя и знак процента ( \1 \1% )

    ПРИМЕЧАНИЕ. Если версия sed поддерживает -r вы можете слегка конденсировать выше:

     $ sed -r 's/([0-9]+)/\1 \1%/g' somefile.txt 12 12% 23 23% 35 35% 67 67% 87 87% 

    Если они устроены:

     12 23 35 67 87 

    пример

     $ sed -r 's/([0-9]+)/\1 \1%/g' somefile.txt 12 12% 23 23% 35 35% 67 67% 87 87% 

    Почему бы не использовать простую cat за которой следует echo , построив и выполнив командную строку из stdin?

     cat somefile.txt|xargs -I {} echo "{} {}%" > somefile.out 
    Linux и Unix - лучшая ОС в мире.