операция параметра внутри строки awk

Наконец, я найду ответ Думает всем, кто помог

это код:

# Use “getopts” to give options to the script
while getopts "i:a:y:" option; do
case $option in
i)
i=$OPTARG
;;
a)
a=$OPTARG
;;
y)
y=$OPTARG
;;
\?)
echo -e "\nUsage: mortgage rate amount period\n"
exit 1
;;
esac
done

# Compute the monthly payment
x=$(echo "scale=20;1+$i/200" | bc)
z=$(echo "scale=20;1/6" | bc)
x2z=$(echo "scale=20;e($z*l($x))" | bc -l)
y12=$(echo "scale=20;-$y*12" | bc)
x2z2y12=$(echo "scale=20;e($y12*l($x2z))" | bc -l)
p=$(echo "scale=3;$a*(($x2z-1))/(1-$x2z2y12)" | bc)

# Print the monthly payment
Echo “Your Monthly is $p”
exit 0

-121--125371-

Perl Shell поддерживает три типа переменных: скаляры, списки и хеши.

Perl Shell (psh) сочетает аспекты bash и других оболочек с силой Perl скриптинга.

и

Оболочка Perl - это оболочка, сочетающая интерактивный характер оболочки Unix с силой Perl. Цель состоит в том, чтобы в конечном итоге иметь полнофункциональную оболочку, которая ведет себя так, как ожидалось для нормальной работы оболочки. Но Perl Shell будет использовать синтаксис и функциональность Perl для операторов потока управления и других вещей.

Он не столько различает последовательности, целые числа, плавающие числа и двойные числа [1], сколько бесшовно преобразует их между собой, как это необходимо, точно так же, как это делает Perl.

Трудно понять причину, по которой оболочке нужно было бы различать число 1 и строку «1» в любой ситуации, когда автообнаружение было неправильным, или когда не хватало различных операторов для сравнения строк и чисел против regexp. Так же, как bash или другие оболочки.

[1] См. специализированные модули, такие как Math:: BigFloat , если требуется специальная обработка типов float. или Math:: Bigint для очень больших целых чисел.

-121--82022-

Я использую трофф для моего повседневного набора; Я использую версию трофа Heirloom (см. http://heirloom.sourceforge.net/doctools.html ), которая имеет очень мощную поддержку шрифтов (TTF, Type1, OTF и т. д.), Алгоритм Knuth для форматирования абзаца, а также несколько функций микротипирования, которые невозможно найти в простом TeX; он легче, чем LaTeX и до тех пор, пока вам не нужно набрать уравнения, я нахожу, что гораздо проще получить высокоуровневое наборное решение, чем с LaTeX (гораздо проще загрузить шрифты, получить контроль над точным положением вещей и т. д.).

1
14.04.2018, 23:25
2 ответа

Вы не можете использовать подстановку параметров оболочки внутри awkпрограммы.

Чтобы удалить первый бит шестого столбца, используйтеsub():

bjobs -w | awk 'NR > 1 { sub("^[^*]*[*]", "", $6); print $1, $6 }'

Это изменит шестое поле, удалив бит до *перед его печатью. Регулярное выражение ^[^*]*[*]соответствует любому количеству символов, кроме *в начале строки, а затем *. Затем она заменяется пустой строкой.

Вышеприведенное преобразует вывод вопроса в

821213 pirineus
823954 pirineus4
824083 collserola2
824297 collserola10
824305 collserola5

ПРИМЕЧАНИЕ.:Все варианты ниже (, включая решение sed), предполагают наличие *в шестом поле . Вышеупомянутое сработало бы, даже если бы его не было.

Другой способ сделать это — разделить шестое поле на *и напечатать вторую часть:

bjobs -w | awk 'NR > 1 { split($6, a, "[*]"); print $1, a[2] }'

Третий способ сделать это — использовать как пробелы, так и *в качестве разделителя полей (обратите внимание на изменение номера поля):

bjobs -w | awk -F "[[:blank:]*]+" 'NR > 1 { print $1, $7 }'

Использованиеsed:

bjobs -w | sed -nE 's/^([[:alnum:]]+).*\*([[:alnum:]]+).*/\1 \2/p'
3
27.01.2020, 23:23

Я использовал команду ниже, чтобы получить желаемый результат

awk 'NR >=2{print $1,$6}' example.txt  | sed "s/[0-9]\{1,2\}\*//g"

выход

821213 pirineus
823954 pirineus4
824083 collserola2
824297 collserola10
824305 collserola5
0
27.01.2020, 23:23

Теги

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