Найти последовательные целые числа из списка чисел

Обычно попробуйте установить гостевые -дополнения из гостевых -репозиториев вместо компакт-диска (сначала включите вашиcontrib-репозитории в гостевой ).

Тем не менее, для Fedora может потребоваться компиляция:

  1. Обновите Fedora -гость:

    sudo dnf update && sudo dnf upgrade
    
  2. Установите необходимые модули ядра -и заголовков -:

    sudo dnf install dkms gcc kernel-devel kernel-headers
    
  3. Перезагрузите Fedora -гость

    sudo shutdown -r now
    
  4. При новой загрузке «вставьте» гостевой -дополнения -ISO в гостевую систему Fedora -и запустите ееVBoxLinuxAdditions.run-файл

  5. Введите свой пароль, после чего должна начаться компиляция/установка.

  6. По завершении компиляции перезагрузите гостевую систему, как описано выше. Теперь это должно работать!


Не забудьте добавить имя пользователя VirtualBox Guest -в группу vboxsf,в противном случае (как гость )у вас нет разрешения на запись в эту общую папку:

sudo adduser username vboxsf

Это работает?

0
20.01.2019, 00:59
2 ответа

не в bash, а в awk. что большинство считает честной игрой в сценариях bash/shell. многие. по крайней мере мной.

func printrun() {
  if(run > 1) {
    print run""dir
  }
}
NR == 1 {
  #print $1" first"
  prev = $1
  dir = "-"
  run = 1
  next
}
$1 == prev+1 && dir == "v" {
  #print $1" up from down"
  printrun()
  prev = $1
  dir = "^"
  run = 2
  next
}
$1 == prev+1 {
  #print $1" up"
  prev = $1
  dir = "^"
  run++
  next
}
$1 == prev-1 && dir == "^"  {
  #print $1" down from up"
  printrun()
  prev = $1
  dir = "v"
  run = 2
  next
}
$1 == prev-1 {
  #print $1" down"
  prev = $1
  dir = "v"
  run++
  next
}
{
  #print $1" else"
  printrun()
  prev = $1
  dir = "-"
  run = 1
}
END {
  #print "end"
  printrun()
}

Я пытался сжать код в вариациях цепочек if и else if, но нашел этот вариант наиболее понятным и читабельным.

сохранить вrun.awk

беги вот так

$ awk -f run.awk inputfile

или ввод трубы

$ commandproducinginput | awk -f run.awk

объяснение:

awk примерно так работает :он будет читать ввод построчно. для каждой строки он будет выполнять блоки кода, для которых условие истинно.

Блок кода — это то, что заключено в фигурные скобки. условие — это часть перед кодовым блоком.

condition { code block }

BEGINи END— особые условия, которые выполняются до первой строки и после последней строки соответственно. в этом коде у нас нет BEGIN. только END.

funcне является условием. вместо этого это объявление функции, которое будет использоваться позже.

условие первого блока NR == 1. NR— это номер записи, который практически означает номер строки. фактически это означает, что блок будет выполняться в первой строке и больше никогда. в этом блоке мы устанавливаем переменные в нормальные значения.

этот блок и большинство других блоков заканчиваются оператором next. nextуказывает awk отказаться от этого цикла и загрузить следующую строку и начать следующий цикл поиска блоков для запуска. с помощью nextмы эффективно создали большую цепочку if else if.

условие следующего блока $1 == prev+1 && dir == "v". это проверяет, является ли текущее число на единицу больше, чем предыдущее число, и является ли направление выполнения в настоящее время нисходящим.если оба варианта верны, мы печатаем текущий запуск и обновляем переменные, чтобы начать новый запуск. если нет, то этот блок не будет выполнен, и awk будет искать следующий блок для выполнения.

Следующие условия и блоки аналогичны этому.

предпоследний блок, блок перед блоком END, является блоком без условия. это означает, что он был бы выполнен для каждой строки. из-за операторов nextв предыдущих блоках этот блок будет выполняться только в том случае, если предыдущий блок не выполнялся. по сути, этот блок является «иначе» цепочки if else if.

Этот блок достигается, если число не является последовательным ни вверх, ни вниз. поэтому код в этом блоке устанавливает переменные в соответствии с концом выполнения.

в псевдокоде код может выглядеть так:

if first line:
  init vars and set run to none
else if now going up but was going down:
  print ongoing run down and start a run up
else if now going up:
  start or continue run up
else if now going down but was going up:
  print ongoing run up and start a run down
else if now going down:
  start or continue run down
else:
  print ongoing run and set run to none
if end of input:
  print ongoing run
1
15.03.2021, 21:36
awk 'function prnt(Xdir){ if (c)print c+1, Xdir; c=0 } 
(pre+1==$0){ prev_dir=dir; dir="▲"; if(prev_dir!=dir) prnt(prev_dir); c++; pre=$0; next }
(pre==$0+1){ prev_dir=dir; dir="▼"; if(prev_dir!=dir) prnt(prev_dir); c++; pre=$0; next }
 c{ prnt(dir) } 
{ pre= $0}
END{ prnt(dir) }' infile

4 ▲
3 ▲
3 ▼
0
17.03.2021, 09:36

Теги

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