Как распечатать значения из файла данных после того, как будет найден определенный шаблон и между ними будет пропущена одна строка?

У меня была эта проблема, и я сначала переключился на драйвер 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это сработало!

Это сообщение, на которое я перешел , чтобы получить эти инструкции.

4
13.01.2021, 10:47
4 ответа
$ 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для получения дополнительной информации о вышеупомянутом подходе и других способах сделать что-то после совпадения.

2
18.03.2021, 22:37

Следующая 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соответственно.

4
18.03.2021, 22:37

Используйте оператор диапазона ,. Начало — это линия точек данных, а конец — eof.

awk '
 /DATA_POINTS/,0 {
    if ( /DATA_POINTS/ ) {
      getline; next 
   }
   printf "S%-2d=%s%s\n", ++k, OFS, $6
 }
' file
2
18.03.2021, 22:37

Это решение, состоящее из одной -строки, извлекает номер строки с помощью sed, добавляет 2 с помощью bc, использует tail для извлечения блока данных и, наконец, awk для получения правильного столбца. Вероятно, не самое чистое или простое решение, но для меня это было понятнее, чем использование только awk.

sed -n '/DATA_POINTS/=' $file | xargs -i echo '{}+2' | bc | xargs -i tail -n+{} $file | awk '{print $6}'

0
18.03.2021, 22:37

Теги

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