
У меня есть файл, содержащий строки с различными буквенно-цифровыми строками, разделенными пробелом-тире-пробелом. Однако есть строки, где присутствует только одно буквенно-цифровое значение и разделитель, а другое строковое значение отсутствует. Пример:
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
Спасибо, Гильермо.