Intereting Posts
Разделить аналогичные строки Включение драйвера brcmfmac для Wi-Fi на Macbook Pro Почему две почти idetic команды grep возвращают разные выходные данные: w / o и с именем файла Как искать официальные пакеты RHEL Настройка подсветки синтаксиса выделения в Geany как понять таблицу маршрутизации на клиенте OpenVPN Какое распределение все еще поддерживает ядро ​​2.6.x? Проверьте слово в ожидании вывода и добавьте его в текстовый файл Как запустить Firefox в режиме сценария Почему передача HEREDOC в виде строки для `ruby -e` не работает? Запуск GNU Parallel на 2 или более узлах с планировщиком Slurm Как получить абсолютный путь от использования команды find unix Содержит ли мягкая привязка к каталогу жесткие ссылки на его подфайлы? удалять старые файлы журналов, кроме последнего (с буквенно-цифровой сортировкой) Инициирующий менеджер GDM / Дисплей в уже существующей сессии X11

Как вы получаете десятичный знак из математической операции с переменной?

Я пытаюсь найти SCALEFACTOR который составляет в основном 10000/(sum of 4th column in a file) . Как получить десятичное число из вывода? Оцените любую помощь заранее.

 #!/bin/bash FILES=/path/to/files/*; for f in ${FILES} do echo $f COLTOTAL="$(awk '{sum += $4} END {print sum}' $f)" echo "total: ${COLTOTAL}" # SCALEFACTOR=`expr 10^5 / $COLTOTAL` B=10000 SCALEFACTOR=$((B / ${COLTOTAL})) SCALINGFACTOR=$(echo "100000 / $COLTOTAL" | bc -l # echo "scale=5; ${SCALEFACTOR}" | bc echo ${SCALEFACTOR} awk '{print($1"\t"$2"\t"$3"\t"$4 * ${SCALINGFACTOR})}' $f > $f"_normalized.txt" done 

Способ, которым вы реализовали цикл for будет ломаться, если у вас есть файлы с пробелами в них. Он будет работать отлично, без переменной, for f in /path/to/files/* , так как расширение происходит так, как может понять цикл for .

Как правило, поскольку вам стоит выделять ресурсы для создания новых процессов, лучше всего иметь только один экземпляр awk и, как отметил @ jw013, вы должны выполнить разделение вне оболочки, так как sh и bash неспособны к математике с плавающей запятой ,

Поскольку вам нужно знать конец файла для управления каждой строкой, у вас есть два варианта: прочитать каждый файл, сохранить каждую строку для второго чтения или прочитать каждый файл дважды. Поскольку сохранение больших файлов в памяти может быть проблематичным, я выбрал второй вариант:

 for f in /path/to/files/*; do echo "$f" awk ' NR == FNR { sum += $4; next; } FNR == 1 { print "total: " sum; SCALEFACTOR = 10000 / sum; print SCALEFACTOR; } { printf("%s\t%s\t%s\t%f\n", $1, $2, $3, $4 * SCALEFACTOR); }' "$f" "$f" 

NR == FNR говорит, что общий номер записи (строки) совпадает с номером записи текущего файла, что означает, что вы находитесь в первом файле, а задача под рукой – определить сумму. next предотвращает запуск других статей. В противном случае, если в первой строке второго чтения файла мы делаем материал, который у вас был между вашими awk вызовами. Для каждой строки в этом втором чтении мы печатаем четыре элемента, причем четвертый элемент масштабируется, как вы указали.

Вы можете использовать стандартное форматирование строк для этого четвертого элемента, например, ваша bc шкала bc из пяти изменит мой %f на %.5f