У меня была эта проблема, и я сначала переключился на драйвер nouveau, который исправил дисплей моего ноутбука, но не позволил мне подключить второй монитор. Я исправил эту проблему, запустив:
sudo ubuntu-drivers devices
, который показал, что был рекомендован драйвер nvidia.
driver : nvidia-driver-390 - distro non-free recommended
driver : xserver-xorg-video-nouveau - distro free builtin
Тогда я побежал
sudo ubuntu-drivers autoinstall
, который установил и использовал драйвер nvidia. После перезагрузки sudo shutdown -r now
это сработало!
Это сообщение, на которое я перешел , чтобы получить эти инструкции.
$ awk '/DATA_POINTS/{c=3} c&&!--c{f=1} f{printf "S%d = %s\n", ++s, $6}' file
S1 = A
S2 = B
S3 = C
S4 = D
S5 = E
S6 = F
S7 = U
S8 = W
S9 = L
S10 = K
S11 = U
S12 = X
Чтобы начать печать с 27-й строки от совпадающей строки (включительно )вместо 3-й, просто измените 3 на 27.
См.https://stackoverflow.com/questions/17908555/printing-with-sed-or-awk-a-line-following-a-matching-pattern/17914105#17914105для получения дополнительной информации о вышеупомянутом подходе и других способах сделать что-то после совпадения.
Следующая awk
программа должна выполнять эту работу:
awk 'BEGIN{n=-1}
n>0{printf "S%-*d=%s\n",w,++i,$6; if (i==n) {i=0;n=-1}}
n==0{n=$1;w=length($1)}
$0=="DATA_POINTS"{n=0}' file
Это будет:
n
с помощью -1
, что означает «вне блока данных». DATA_POINTS
, установите n
на 0
, что означает «следующая строка содержит количество точек данных» n
равно нулю, содержимое строки интерпретируется как количество точек данных и сохраняется в n
. Длина этого числа (в символах/цифрах )сохраняется в поле w
, которое позже используется для форматирования вывода. n
больше, чем 0
, что указывает на то, что мы находимся внутри блока «данных», напечатать «ключ» со счетной переменной i
(, отформатированной для фиксированной ширины, используя w
и скорректированную слева -. как в вашем примере вывода )и 6-е поле строки, пока i
не будет равно n
, после чего n
сбрасывается на-1
Это, вероятно, имеет больше функциональных возможностей, чем вам нужно, поскольку оно может обрабатывать блоки данных, которые не расположены в конце файла (оно учитывает количество строк данных, указанное в заголовке, а не читает только до конец -файла -).
Обратите внимание , что метод поиска DATA_POINTS
в настоящее время представляет собой полное сопоставление строк, что является наиболее надежным методом, если фактическая строка может содержать специальные символы. Если вам нужно частичное сопоставление строк или сопоставление регулярных выражений, используйте
index($0,"DATA_POINTS") {... }
или (как в вашем примере)
/DATA_POINTS/ {... }
Кроме того, если вы хотите предотвратить неправильное толкование пустых строк, замените n>0
и n==0
на n>0&&NF
и n==0&&NF
соответственно.
Используйте оператор диапазона ,
. Начало — это линия точек данных, а конец — eof.
awk '
/DATA_POINTS/,0 {
if ( /DATA_POINTS/ ) {
getline; next
}
printf "S%-2d=%s%s\n", ++k, OFS, $6
}
' file
Это решение, состоящее из одной -строки, извлекает номер строки с помощью sed, добавляет 2 с помощью bc, использует tail для извлечения блока данных и, наконец, awk для получения правильного столбца. Вероятно, не самое чистое или простое решение, но для меня это было понятнее, чем использование только awk.
sed -n '/DATA_POINTS/=' $file | xargs -i echo '{}+2' | bc | xargs -i tail -n+{} $file | awk '{print $6}'