Линии печатания AWK и сбрасывать некоторые из их

Я новичок AWK. У меня есть следующий мотив в огромном файле.

~ Gradients ~
~   x               y            z      ~
~~ 
~ H         1      0.00781      0.00108      0.00038 ~
~ H         2      0.01271     -0.01507      0.02839 ~
~ C         1     -0.05015     -0.01803      0.01588 ~
~ O         1      0.01733      0.03089     -0.04611 ~
~ O         2      0.01230      0.00114      0.00147 ~

мне нужно извлечь эти числа (x y z):

0.00781      0.00108      0.00038
0.01271     -0.01507      0.02839
-0.05015     -0.01803      0.01588
0.01733      0.03089     -0.04611 
0.01230      0.00114      0.00147

Я написал следующий скрипт:

awk '/z ~/ {for(i=-2; i<=3; i++) {getline; print , , }}' filename

но это дает мне пустую строку из-за "~~" линии.

Я хотел бы игнорировать эту строку и получает только столбцы xyz

xyz
xyz
xyz
xyz 

etc. без пустых строк...

может кто-нибудь помочь мне, пожалуйста?

25
задан Scott
17.02.2023 19:33 Количество просмотров материала 2804
Распечатать страницу

2 ответа

можешь объяснить яснее ровно что вы пытаетесь сделать?  Похоже, вы пытаетесь напечатать значения x, y и z (, и ) из следующих шести строк после строки, содержащей литерал z затем ~.  Но это не имеет большого смысла-если у вас нет повторяющегося шаблона заголовка, пять строк данных, другой заголовок, еще пять строк данных, п. - и, если это так, то тебе действительно нужно объяснить это.  И если это то, что вы пытаетесь сделать, почему вы это делаете с for(i=-2; i<=3; i++) вместо for(i=1; i<=6; i++).

и это не лучший способ использовать getline.

если я правильно понимаю вашу цель, все, что вам нужно-это

awk 'NF==7 {print , , }' filename

, который будет печатать 4-е, 5-е и 6-е поля (x, y и z) из каждой строки, которая имеет семь полей, и игнорировать все остальное.

1
отвечен Scott 2023-02-19 03:21

Ваш вопрос сбивает с толку потому что ваши данные имеют строку заголовка, заканчивая z      ~ и появляется ваша команда для поиска /z ~/, поэтому они не должны совпадать.  Но, может быть, это на самом деле zTab~ в обоих местах.

для простоты, я буду использовать /z *~/, чтобы соответствовать z, затем следует любое количество пробелов, а затем ~.  Продолжайте использовать любую строку поиска.

вы разъяснить в комментарии, что вы хотите к выведите значения x, y и z из 2-й, 3-й, 4-й, 5-й и 6-й строк после строки заголовка, содержащей z   ~.  Вот способ сделать это в awk:

awk '
        /z *~/          { counter=1; next }
        counter > 1     { print , ,  }
        counter == 6    { counter = 0 }
        counter > 0     { counter++ }
    ' filename
  • /z *~/ { counter=1; next } говорит, когда мы видим строку, содержащую z   ~ мы установить счетчик на 1.  Это будет использоваться для подсчета следующих шести строк.  Используйте next команда не выполнять дальнейшую обработку в этой строке - мы не хотим даже рассматривать возможность печати заголовка линия.
  • counter > 1 { print , , } выводит x, y и z из строк где counter > 1.  Обратите внимание, что это не тест counter > 0 или counter >= 1, таким образом, он пропускает 1-ю строку после заголовка, и печать 2й, 3й, 4й, 5й и 6-й линии.
  • counter == 6 { counter = 0 } говорит, когда counter достигает 6, мы закончили с этим "мотивом", поэтому ставим counter к нулю.
  • counter > 0 { counter++ } просто говорит, что, пока мы находимся в " мотиве", мы должны увеличить (добавить единицу)counter для каждого линия.
0
отвечен Scott 2023-02-19 05:38

Постоянная ссылка на данную страницу: [ Скопировать ссылку | Сгенерировать QR-код ]

Ваш ответ

Опубликуйте как Гость или авторизуйтесь

Имя
Вверх