Как я могу звонить до н.э из awk в этом случае?

Это изображение показывает упрощенную версию истории подобных Unix операционных систем. В зависимости от того, что Вы называете "одной истинной системой Unix", можно загрузить ее как, открытый исходный код или Вы может купить лицензию на нее. Последний будет дорогим если вообще возможный.

Для больше подробно информации, см. историю Unix, как указано AProgrammer в комментарии.

3
18.12.2012, 22:37
3 ответа

Ваша проблема состоит в том, что Вы берете оболочку для того, каково это не: язык программирования. Оболочка перед всем интерпретатор командной строки. Сценарии оболочки являются сценариями. Это Вы реализуете логику, алгоритм Вашей проблемы в синтаксисе оболочки, затем Вы идете по неправильной дороге.

Существуют очевидные проблемы в Вашем коде как неупомянутые переменные. Но в целом, это просто чувствует себя ужасным для выполнения такого количества команд (поскольку оболочка является инструментом к командам выполнения, не языки программирования) только для нахождения пропорции символов кроме 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 приходят на ум). Можно назвать интерпретатор для того языка программирования из сценария оболочки, но только однажды: всего одного вызова должно быть достаточно, чтобы сделать все это.

2
27.01.2020, 21:29
  • 1
    за Ваш совет. на самом деле я уже знаю, Stephane, что языки программирования являются инструментом для этого. но когда это сводится к нему, я просто намного более быстр при размышлении о решении для оболочки, чем решение для программирования, и существует пятиминутное ограничение по времени на сайте для каждой проблемы. вероятно, будут проблемы, которые являются слишком странными, чтобы сделать в оболочке и заняли бы меньше времени в языке, таким образом, я - вид ожидания этого для случая... –  ixtmixilix 18.12.2012, 23:16
  • 2
    я получаю ошибку, когда я выполняю команду, Вы вставили выше: /bin/sh: 1: Syntax error: "|" unexpected –  ixtmixilix 18.12.2012, 23:20
  • 3
    я подозреваю Ваш awk mawk который имеет проблемы приоритета с | оператор. Я отредактировал его так, это портативно к mawk также. –  Stéphane Chazelas 18.12.2012, 23:41
  • 4
    @ixtmixilix - Я не думаю, что намерение того сайта состоит в том, чтобы записать целую программу в 5-минутном ограничении по времени. Скорее ограничение по времени гарантирует, чтобы Вы рассмотрели свое решение прежде, чем загрузить данные тестирования, и предотвращает много попыток грубой силы. Это покрыто FAQ Rosalind. –  ire_and_curses 19.12.2012, 00:10
  • 5
    , Stephane... насколько я могу сказать, команда, не работает со столбцами данных, хотя... –  ixtmixilix 19.12.2012, 01:12

Не зная остальную часть Вашего сценария (я не знаю, полагаетесь ли Вы на $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 
}
0
27.01.2020, 21:29

Я не вижу проблемы мимоходом переменные. Плюс, GNU dc (включенный в до н.э) намного более легче для встроенного calc, меньшего количества передачи по каналу и обратного польского языка:

print '355 113' | awk -vRS='' '{"dc -e \"1000k"$1" "$2"/pq\"" | getline; print; close(dc)}

Согласитесь с Stephane, что оболочка делает работа подсказки, awk делают работу форматирования, и вычисление должно пойти dc

0
27.01.2020, 21:29

Теги

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