заменить каждое второе значение в последовательности специальным символом '*'

Спасибо за ответы

@wurtel :Спасибо за ссылку, теперь все отлично работает

NAME           MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
fd0              2:0    1     4K  0 disk
sda              8:0    0    20G  0 disk
├─sda1           8:1    0   243M  0 part /boot
└─sda2           8:2    0  19,8G  0 part
  ├─vgsys-root 254:0    0 109,5G  0 lvm  /
  ├─vgsys-var  254:1    0   1,9G  0 lvm  /var
  ├─vgsys-usr  254:2    0   3,8G  0 lvm  /usr
  ├─vgsys-home 254:3    0   1,9G  0 lvm  /home
  ├─vgsys-tmp  254:4    0   1,9G  0 lvm  /tmp
  └─vgsys-swap 254:5    0   732M  0 lvm  [SWAP]
sdb              8:16   0   100G  0 disk
└─sdb1           8:17   0   100G  0 part
  └─vgsys-root 254:0    0 109,5G  0 lvm  /
sr0             11:0    1  1024M  0 rom
-4
18.11.2020, 16:48
2 ответа

Обязательноеawk-основанное решение (, где для простоты я буду предполагатьn>2):

awk -v n=9 'BEGIN{q=1; printf "0,*,"; for (i=2;i<n;i++) {s=q+r;r=q;q=s; printf "%s%s",i%2?"*":s,i==n-1?"\n":","}}'

Пользовательский ввод сохраняется в переменной nи передается в awkчерез команду -строковый аргумент -v n=number.

Для немедленного выхода, еслиn<3:

awk -v n=9 'BEGIN{if (n<3) exit; q=1; printf "0,*,"; for (i=2;i<n;i++) {s=q+r;r=q;q=s; printf "%s%s",i%2?"*":s,i==n-1?"\n":","}}'

Пояснение

awk— это инструмент обработки текста -, мы «творчески злоупотребляем» им. Поэтому все происходит внутри блока BEGIN, который обычно содержит код, выполняемый до обработки первого входного файла.

Сам синтаксис очень похож -на C, поэтому мы

  • выведите первые два члена ряда (, которые фиксированы, так как мы предполагаемn>2):printf "0,*,"
  • выполнить цикл от 2до n-1и вычислить число Фибоначчи sкак сумму двух предыдущих qи rи обновить qиr
  • вывести либо *, если iчетное, либо текущее число Фибоначчи s, если оно не четное(i%2?"*":s)
  • и вывести либо ,, либо новую строку после этого, в зависимости от того, достигли ли мы конца цикла(i==n-1)или нет.
2
18.03.2021, 22:49

Наиболее близким к вашему коду с использованием Bash и арифметических операторов является этот:

#!/bin/bash
let UserInput=9 
let a=0 
let b=1
echo -n "The Fibonacci series is: 0"
for (( i=1; i<UserInput; i++ )) ; do
  let sn=a+b
  let a=b
  let b=sn
  if (( i % 2 == 0 )) ; then 
    echo -n ",$a"
  else
    echo -n ",*"
  fi 
done
echo

В операторе ifвы должны использовать оператор %по модулю (остатка ). Используя его, вы можете проверить, делится ли iна два (, то есть четное число ), и вывести значение $aили вывести *соответственно.

Вывод будет:

The Fibonacci series is: 0,*,1,*,3,*,8,*,21

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

let UserInput="$1"
2
18.03.2021, 22:49

Теги

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