Обычно попробуйте установить гостевые -дополнения из гостевых -репозиториев вместо компакт-диска (сначала включите вашиcontrib
-репозитории в гостевой ).
Тем не менее, для Fedora может потребоваться компиляция:
Обновите Fedora -гость:
sudo dnf update && sudo dnf upgrade
Установите необходимые модули ядра -и заголовков -:
sudo dnf install dkms gcc kernel-devel kernel-headers
Перезагрузите Fedora -гость
sudo shutdown -r now
При новой загрузке «вставьте» гостевой -дополнения -ISO в гостевую систему Fedora -и запустите ееVBoxLinuxAdditions.run
-файл
Введите свой пароль, после чего должна начаться компиляция/установка.
По завершении компиляции перезагрузите гостевую систему, как описано выше. Теперь это должно работать!
Не забудьте добавить имя пользователя VirtualBox Guest -в группу vboxsf
,в противном случае (как гость )у вас нет разрешения на запись в эту общую папку:
sudo adduser username vboxsf
Это работает?
не в 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
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 ▼