Это изображение показывает упрощенную версию истории подобных Unix операционных систем. В зависимости от того, что Вы называете "одной истинной системой Unix", можно загрузить ее как, открытый исходный код или Вы может купить лицензию на нее. Последний будет дорогим если вообще возможный.
Для больше подробно информации, см. историю Unix, как указано AProgrammer в комментарии.
Ваша проблема состоит в том, что Вы берете оболочку для того, каково это не: язык программирования. Оболочка перед всем интерпретатор командной строки. Сценарии оболочки являются сценариями. Это Вы реализуете логику, алгоритм Вашей проблемы в синтаксисе оболочки, затем Вы идете по неправильной дороге.
Существуют очевидные проблемы в Вашем коде как неупомянутые переменные. Но в целом, это просто чувствует себя ужасным для выполнения такого количества команд (поскольку оболочка является инструментом к командам выполнения, не языки программирования) только для нахождения пропорции символов кроме A и T в файле.
Кроме того, awk использует числа плавающие на 64 бита внутренне. Вы уверены, что Вам нужно больше точности, чем это. Если те числа должны использоваться чем-то, что имеет больше точности, чем которая, разве Вы не можете использовать это что-то, чтобы сделать все это?
Для ответа на вопрос Вы сделали бы:
$ echo 1 3 | awk -vRS= '{("echo scale=300\\;" $1 "/" $2 "|bc -l") | getline; print}'
.3333333333333333333333333333333333333333333333333333333333333333333\
33333333333333333333333333333333333333333333333333333333333333333333\
33333333333333333333333333333333333333333333333333333333333333333333\
33333333333333333333333333333333333333333333333333333333333333333333\
33333333333333333333333333333
Но можно легко видеть, как бессмысленный, который является: awk выполнение оболочки и двух команд для каждой строки входа, чтение их вывода и печать его снова... Даже внешняя оболочка, возможно, сделала столь же хорошее задание с меньшим количеством суеты.
Немного менее глупое для приближения к нему, если бы Вы все еще хотите использовать awk, было бы:
echo 1 3 | awk 'BEGIN{print "scale=300"}{print $1"/"$2}' | bc
То время, только один awk
и один bc
команда.
Для меня довольно очевидно, что Вам нужен реальный язык программирования здесь (жемчуг, рубин, Python приходят на ум). Можно назвать интерпретатор для того языка программирования из сценария оболочки, но только однажды: всего одного вызова должно быть достаточно, чтобы сделать все это.
Не зная остальную часть Вашего сценария (я не знаю, полагаетесь ли Вы на $m$n возвращаемых значений где-то в другом месте) - Вы рассмотрели это?
gc-numeric-count () {
n=$(nucleic-line $@ | wc -l)
m=$(nucleic-line $@ | grep -v "[AT]" | wc -l)
echo "scale=1000;${m}/${n"}
}
export -f gc-numeric-count
column-percent-count () {
for f in $@; do gc-numeric-count $f | bc -l; done
}
Я не вижу проблемы мимоходом переменные. Плюс, GNU dc (включенный в до н.э) намного более легче для встроенного calc, меньшего количества передачи по каналу и обратного польского языка:
print '355 113' | awk -vRS='' '{"dc -e \"1000k"$1" "$2"/pq\"" | getline; print; close(dc)}
Согласитесь с Stephane, что оболочка делает работа подсказки, awk делают работу форматирования, и вычисление должно пойти dc
/bin/sh: 1: Syntax error: "|" unexpected
– ixtmixilix 18.12.2012, 23:20awk
mawk
который имеет проблемы приоритета с|
оператор. Я отредактировал его так, это портативно к mawk также. – Stéphane Chazelas 18.12.2012, 23:41