Есть несколько вариантов драйверов Intel, которые, если они не работают должным образом с вашим оборудованием, могут вызвать такие проблемы:
lvds_downclock
, но по умолчанию выключено. Если вы изменили это значение по умолчанию, попробуйте это в первую очередь. (Возможно, некоторые версии ядра включены по умолчанию, поэтому стоит попробовать отключить его принудительно). i915_enable_fbc
может вызывать различные проблемы с отображением. По умолчанию используется для каждого чипа, вы можете попробовать выключить его. И то, и другое, вероятно, немного увеличит потребление энергии.
powersave
по умолчанию установлено значение true, его выключение отключит сразу несколько функций энергосбережения. Это, вероятно, сработает, но вы заметите, что время автономной работы снизилось. Есть два способа установить эти значения:
i915.i915_enable_fbc = 0
. Да, вам нужен i915.
, даже если имя опции начинается с i915. Вы можете временно протестировать, отредактировав командную строку в GRUB перед загрузкой и навсегда установив в конфигурации grub (отредактируйте / etc / default / grub
, затем запустите update-grub
. Или dpkg-reconfigure grub-pc
). /etc/modprobe.d
, например /etc/modprobe.d/local-i915.conf
. Затем внутри него поместите options i915 i915_enable_fbc = 0 lvds_downclock = 0
(и т. Д.). Обратите внимание, что вы не используете i915. Здесь префикс
. После редактирования запустите update-initramfs -u
. Другой вариант - попробовать более новое ядро. В настоящее время Debian Backports имеет версию 3.12. В новых ядрах исправлено множество ошибок в видеодрайвере Intel, а также улучшено понимание того, на каком оборудовании работают определенные функции энергосбережения.
Чтение файла в одном и сохранение того, что находится между двумя шаблонами, может быть выполнено следующим образом:
#!/usr/bin/env python3
import sys
flag=False
vals = []
with open(sys.argv[1]) as fd:
for line in fd:
if line.strip() == "DDD" or flag:
# encountered line where we should stop appending values
if line.strip() == "ABAB":
flag = False
# print the line and two others, then move in what was between originally
print(line.strip())
for i in range(2):
print(fd.readline().strip())
print("\n".join(vals))
continue
# store values while we haven't hit ABAB
flag = True
vals.append(line.strip())
continue
print(line.strip())
Re -с использованием оригинальной идеи awk Мне пришлось прочитать файл дважды, мы можем сделать то же самое в Python:
#!/usr/bin/env python3
import sys
flag_pos,match = 0,0
vals = []
with open(sys.argv[1]) as fd:
for index, line in enumerate(fd):
if line.strip() == "DDD":
flag_pos = index
if line.strip() == "ABAB":
vals.append(line.strip())
fd.readline()
vals.append(fd.readline().strip())
with open(sys.argv[1]) as fd:
for index,line in enumerate(fd):
if index == flag_pos:
print("\n\n".join(vals),"\n")
if line.strip() in vals:
fd.readline()
continue
print(line.strip())
Этот скрипт можно сохранить как movelines.py
и вызвать как./movelines.py input.txt
Это выполнимо в gawk
, вероятно, гораздо проще, чемsed
:
$ awk 'NR==FNR && $0=="ABAB" { a[i++]=$0;getline;getline; a[i++]=$0; }; NR!=FNR { if($0=="DDD") for(val in a) printf "%s\n\n",a[val]; if($0 == "ABAB") {getline;getline;getline;} print $0 }' input.txt input.txt
AAA
BBB
CCC
ABAB
ACAC
DDD
EEE
FFF
GGG
HHH
Хитрость здесь в том, что мы дважды передаем файл в awk
для чтения и различаем первое чтение, которое находит строки, которые мы хотим переместить, и второе чтение, когда мы их фактически перемещаем.
Если в вашем реальном файле нет пустых строк, как в приведенном вами примере, вам просто нужна одна getline
вместо двух, и "%s\n"
во второй части кода будет достаточно.
Для удобства чтения приведена многострочная версия кода с комментариями:
# on first reading NR != FNR,
# so lets store ABAB and the other line into array
awk 'NR==FNR && $0=="ABAB" {
# i variable will be initialized once incremented first time
a[i++]=$0;getline;getline; a[i++]=$0;
};
# Here we are reading the same file second time
NR!=FNR {
if($0=="DDD")
for(val in a)
printf "%s\n\n",a[val];
# Skip what we matched already
if ($0 == "ABAB"){
getline;
getline;
getline;
}
print $0
}' input.txt input.txt
Вы хотели с помощью sed
, чтобы вы могли сделать это, как показано:
sed -e '
/DDD/,/ABAB/! b
H;/ABAB/!{$!d;};g
s/\(\n.*\)\n\(.*\)/\2\1/
' input.txt
Это упрощается с помощью ed
редактора:
ed -s input.file - <<\eof
/ABAB/m?DDD?-
wq
eof
ПРИМЕЧАНИЕ. :Я предполагаю, что ваши данные , а не содержат пустые строки между каждой записью; если это так, вам нужно будет адресовать четыре строки, т.е. изменить +
на+3
С GNUed
:
$ ed -s file <<EOF
/ABAB/,//+m?DDD?-
,p
q
EOF
где
/ABAB/,//+
обращается к диапазону строк от /ABAB/
до предыдущего совпадения //
плюс одна строка m
перемещает адресуемые строки в ?DDD?-
предыдущая строка соответствует DDD
, минус одна строка ,p
распечатать весь буфер В виде одного -вкладыша,
printf '/ABAB/,//+m?DDD?-\n,p\nq\n' | ed -s file
Чтобы отредактировать file
на месте, замените ,p\nq\n
на,wq\n
(w rite и q uit ).
Я сделал следующим способом
команда
Step1: h=`sed -n '/[A-Za-z]\{4\}/p' filename| sed -n '1p'`
step2:m=`sed -n '/[A-Za-z]\{4\}/p' filename| sed -n '2p'`
step3
sed '/[A-Z]\{4\}/d' filename|sed "/CCC/s/.*/&\n\n$h\n\n$m/g"| sed '/^$/d'
выход
AAA
BBB
CCC
ABAB
ACAC
DDD
EEE
FFF
GGG
HHH