AWK: как удалить определенные строки, которые НЕ содержат определенный шаблон?

AWK: как удалить определенные строки, которые НЕ содержат определенный шаблон?

У меня есть файл, содержащий строки с различными буквенно-цифровыми строками, разделенными пробелом-тире-пробелом. Однако есть строки, где присутствует только одно буквенно-цифровое значение и разделитель, а другое строковое значение отсутствует. Пример:

MN_L_DAX-NORDNET_D36 - DK0060975886
MN_L_DAX-NORDNET_D35 - DK0060975613
DK0060056323-DKK -
DK0060186294-DKK -

В последних двух строках в приведенном выше примере отсутствует буквенно-цифровая строка справа от разделителя, и я хочу их удалить. Я попытался использовать следующее выражение awk:

awk '!/* - /' sourcefile.txt > temp.txt && mv temp.txt sourcefile.txt

Под !/* - /этим я подразумеваю "найти шаблон, где после любого символа (*) есть пробел-тире-пробел ( - ) и ничего после, и если такой шаблон не найден (!)", то переместить оставшиеся строки в файл temp.txt и заменить содержимое sourcefile.txt содержимым temp.txt. Однако, когда я запускаю указанный выше скрипт awk, ничего не происходит ни с одним из содержимых sourcefile.txt - все остается прежним. Я также не получаю никаких ошибок. Что здесь может быть не так? Учитывая приведенные выше примеры строк, желаемый вывод после запуска скрипта awk должен выглядеть следующим образом:

MN_L_DAX-NORDNET_D36 - DK0060975886
MN_L_DAX-NORDNET_D35 - DK0060975613

решение1

Чтобы напечатать строки, заканчивающиеся буквенно-цифровым символом, достаточно просто:

$ awk '/[[:alnum:]]$/' file
MN_L_DAX-NORDNET_D36 - DK0060975886
MN_L_DAX-NORDNET_D35 - DK0060975613

решение2

Еще проще:

awk '$3' inputfile

Это сокращение от awk '$3!=""', что является сокращением от awk '$3!=""{print}', что является сокращением отawk '$3!=""{print $0}'

Для записи:

sed /-$/dвероятно, быстрее, и grep -ve '-$'даже быстрее.

решение3

Благодаря предложению @guillermo chamorro мне удалось добиться желаемого результата, изменив свой скрипт следующим образом:

awk '!/^.* -$/' sourcefile.txt > temp.txt && mv temp.txt sourcefile.txt

Спасибо, Гильермо.

Связанный контент