Чтобы получить желаемый вывод в идиоматическом awk , мы делаем разделитель поля ввода (с -F
), содержащий все, что мы хотим удалить (привязанный с :
), и делаем разделитель выходного поля (OFS
) на что мы хотим заменить. Загвоздка в том, что это не устранит пробел и цифры в конце строки, и для этого нам нужно сделать что-то большее. Реализация GNU awk позволит нам использовать регулярное выражение для разделителя входной записи (RS
), но мы могли бы просто сделать sub()
с жалобой POSIX awk как Что ж. Наконец, принудительный пересчет с помощью $1=$1
... побочные эффекты для этого шаблона / оператора заключаются в том, что буфер будет пересчитан при замене FS / RS для нас, и что непустые строки будут выполнять действие по умолчанию - то есть печать.
gawk -F '[[:space:]]*[[:digit:]]*:[[:space:]]*' -v OFS=: -v RS='[[:space:]]*[[:digit:]]*\n' '$1=$1' file
Или:
awk -F '[[:space:]]*[[:digit:]]*:[[:space:]]*' -v OFS=: '{ sub(/[[:space:]]*[[:digit:]]*$/, “”) } $1=$1' file
A sed реализация забавна, но, вероятно, медленнее (потому что текущие версии awk имеют лучшие реализации регулярных выражений).
sed 's/[[:space:]]*[[:digit:]]*:[[:space:]]/:/g; s/[[:space:]]*[[:digit:]]*[[:space:]]*$//' file
Или, если классы символов POSIX недоступны ...
sed 's/[\t ]*[0-9]*:[\t ]/:/g; s/[\t ]*[0-9]*[\t ]*$//' file
Что-то говорит мне, что ваш «ПЕРВЫЙ, ВТОРОЙ, ТРЕТИЙ ...» может быть более сложным и содержать цифры ... в этом случае вы можете поэкспериментировать с заменой *
на +
для awk или \+
для sed .