Объединение регулярных выражений awk и bc - PullRequest
0 голосов
/ 23 ноября 2018

У меня есть текстовый файл, содержащий однострочные номера, такие как «123 2345 432 487 11».Я хочу взять логарифм (ln) каждого числа и сохранить его в виде текстового файла.Я пытался, но не смог объединить команду bc -l и awk.Знаете ли вы, как я могу это реализовать?

awk '{for(i=1;i<=NF;i++) $i = l($i) | bc -l }' text.txt

Ответы [ 2 ]

0 голосов
/ 23 ноября 2018

Вам на самом деле не нужно bc, поскольку в awk есть отличная функция "log":

awk '{for(i=1;i<=NF;i++)print log($i)}' input.txt

Если вы хотите увидеть значения с большей точностью, используйте printf вместо print,Например:

awk '{for(i=1;i<=NF;i++)printf "%.12f\n",log($i)}' input.txt

Если вы действительно хотите использовать bc, вы можете сделать это без awk, изготовив ввод для bc, например, с помощью команды shell printf (котораяаналогична команде awk printf, но отличается от нее тем, что команда оболочки повторяет формат до тех пор, пока не закончится аргумент):

printf "l(%s);\n" $(<input.txt) | bc -l

или, если input.txt имеет многоданные

xargs printf "l(%s);\n" <input.txt | bc -l
0 голосов
/ 23 ноября 2018

Попробуйте:

awk '{for(i=1;i<=NF;i++)system("echo l\\("$i"\\)|bc -l")}' input.txt > output.txt

Какие выходы:

4.81218435537241749526
7.76004068088037973937
6.06842558824411031185
6.18826412308258979072
2.39789527279837054406
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...