awk для удаления строк, начинающихся с символа без ключевого слова в них - PullRequest
0 голосов
/ 15 мая 2018

Я пытаюсь выборочно удалить строки, которые начинаются с #, но не содержат в себе ключевые слова Build или Type.Строки, которые не начинаются с #, остаются без изменений.Я могу удалить все строки, начинающиеся с #, используя первый awk, но не уверен, как выборочно удалять строки, начинающиеся с #, но не содержащие ключевое слово.Второй awk выполняется, но оставляет только две строки (#CN Filters: # Flags = 1,2,3).Спасибо:).

awk

awk '!/#/' input < out  # will remove all lines with #

awk

awk '/#/ && !/Build|Length/' input < out  # remove lines starting with # but must not have Build or Length in them

вход various spacing

#Build = NCBI Build 37
#CN Filters:
#  Flags = 1,2,3
#  Type = Lowess
Length  Event   ID
1   Gain    xxx
10  Loss    yyy

желаемый выход

Build = NCBI Build 37
Type = Lowess
Length  Event   ID
1   Gain    xxx
10  Loss    yyy

Ответы [ 5 ]

0 голосов
/ 16 мая 2018
awk '!/CN|Fl/{sub(/\43/,"")sub(/^\s*/,"");print}' file

Build = NCBI Build 37
Type = Lowess
Length  Event   ID
1   Gain    xxx
10  Loss    yyy
0 голосов
/ 15 мая 2018

Вы хотите что-то сделать со строками, которые начинаются с # и не содержат Build или Type, верно? Я уверен, что вы могли бы написать это условие:

  1. Начните с # = /^#/
  2. И = &&
  3. Не содержит Build или Type = !/Build|Type/

1020 * т.е. *

/^#/ && !/Build|Type/

Теперь, что вы хотели сделать, когда это условие верно? Не печатать текущую строку. Так что вы можете написать это просто:

awk '/^#/ && !/Build|Type/{next} 1'

но если вы предпочитаете использовать awks по умолчанию при заданном истинном условии, вам просто нужно отменить ваше условие (a{next} 1 = !a):

awk '!(/^#/ && !/Build|Type/)'

, который с помощью булевой алгебры (!(a && b) = !a || !b) может быть уменьшен до:

awk '!/^#/ || /Build|Type/'
0 голосов
/ 15 мая 2018

После awk может помочь вам тоже.

awk '!(/^#/ && !/Build/ && !/Type/){gsub(/^#|^# +/,"");print}'  Input_file

Пояснение:

awk '
!(/^#/ && !/Build/ && !/Type/){  ##Checking condition here if a line starts with # and NOT having string Build and Type in it, Negating this condition to work it as opposite, if this condition is TRUE then do following.
  gsub(/^#|^# +/,"");            ##Using gsub to remove hash in starting of a line OR remove a hash starting fr a line with space with NULL in current line.
  print                          ##Printing the current line here.
}' Input_file                    ##Mentioning the Input_file name here.
0 голосов
/ 15 мая 2018

Sed раствор:

$ sed 's/^# *\(.*\(Build\|Type\).*\)/\1/;/^#/d'  file
Build = NCBI Build 37
Type = Lowess
Length  Event   ID
1   Gain    xxx
10  Loss    yyy
0 голосов
/ 15 мая 2018
$ awk '!/^#/ || /Build|Type/' file
#Build = NCBI Build 37
#  Type = Lowess
Length  Event   ID
1   Gain    xxx
10  Loss    yyy

Если вы хотите удалить эти начальные # символы и пробелы после них:

$ awk '!/^#/ || /Build|Type/ { sub("^#[[:blank:]]*", ""); print }' file
Build = NCBI Build 37
Type = Lowess
Length  Event   ID
1   Gain    xxx
10  Loss    yyy
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...