bash для захвата конкретного экземпляра шаблона и исключения других - PullRequest
0 голосов
/ 11 октября 2018

Я пытаюсь захватить и прочитать в $line строку или строки в file, которые содержат только del (строка 2 является примером).Строка 3 содержит del, но также имеет ins и bash, когда выполняется в данный момент, захватывает оба.Я не уверен, как исключить что-либо, кроме del, и захватить только эти строки.Спасибо:).

файл

NM_003924.3:c.765_779dupGGCAGCGGCGGCAGC
NM_003924.3:c.765_779delGGCAGCGGCGGCAGC
NM_003924.3:c.765_779delGGCAGCinsGGCGGCAGC
NM_003924.3:c.765_779insGGCAGCGGCGGCAGC

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

NM_003924.3:c.765_779delGGCAGCGGCGGCAGC

bash w /токовый выход

while read line; do
  if [[ $line =~ del ]] ; then echo $line; fi
done < file

NM_003924.3:c.765_779delGGCAGCGGCGGCAGC
NM_003924.3:c.765_779delGGCAGCinsGGCGGCAGC

Ответы [ 5 ]

0 голосов
/ 12 октября 2018

Вот еще один ответ с использованием PCRE grep.Это должно работать с опцией -P в GNU grep

$ grep -P 'del\.*(?!.*ins)' inputFile
NM_003924.3:c.765_779delGGCAGCGGCGGCAGC
0 голосов
/ 12 октября 2018

Вот решение sed.Он отменяет совпадение del, за которым следует ins, и печатает все, что содержит del.-n для отключения любого другого выхода.

$ sed -n -e '/del.*ins/!{/.*del.*/p}' inputFile
NM_003924.3:c.765_779delGGCAGCGGCGGCAGC
0 голосов
/ 11 октября 2018

Попробуйте:

while read -r line; do
    [[ $line =~ del && ! $line =~ ins ]] && printf '%s\n' "$line"
done < file

Пересмотренный код также ShellCheck чист и исключает BashPitfall # 14 .

Это решение может завершиться ошибкой, еслипоследняя строка в файле не имеет завершающей строки.Если это вызывает беспокойство, см. Принятый ответ на Считывание последней строки файла в скрипте bash при чтении файла строка за строкой для исправления.

0 голосов
/ 11 октября 2018

Разделите его на 2 шага.Вам не нужен цикл:

grep "del" file | grep -v "ins"
0 голосов
/ 11 октября 2018

Не могли бы вы попробовать следующее (если все в порядке с awk).

awk '/del/ && !/ins/'  Input_file
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...