bash, текстовый файл удаляет весь текст в каждой строке перед последним пробелом

Вопрос или проблема

У меня есть файл с форматом, похожим на этот:

Имя Фамилия UID
Имя Отчество Фамилия UID

В основном некоторые имена имеют отчества (а иногда больше одного отчества). Я просто хочу файл, который содержит только UID.

Есть ли команда sed или awk, которую я могу выполнить, чтобы удалить все, что находится перед последним пробелом?

awk

Выведите последнее поле каждой строки с помощью .

Последнее поле индексируется с помощью переменной NF, которая содержит количество полей для каждой строки. Мы индексируем его с помощью знака доллара, и получившаяся однострочная команда проста.

awk '{ print $NF }' файл

rs, cat & tail

Другой способ — транспонировать содержимое файла, затем взять последнюю строку и снова транспонировать (это довольно легко понять).

Получившаяся команда:

cat файл | rs -T | tail -n1 | rs -T

cut & rev

Используя и rev, мы также можем достичь этой цели, перевернув строки, вырезав первое поле и затем снова перевернув его.

rev файл | cut -d ' ' -f1 | rev

sed

Используя , мы просто удаляем все символы до тех пор, пока не будет найден пробел, с помощью ^.* [^ ]*$. Этот regex означает, что нужно найти начало строки ^, за которым следует любая последовательность символов .* и пробел . Остальная часть — это последовательность непробельных символов [^ ]* до конца строки $. Однострочная команда sed:

sed 's/^.* \([^ ]*\)$/\1/' файл

Где мы захватываем последнюю часть (между \( и \)) и подставляем ее обратно для всей строки. \1 означает первую захваченную группу, которая является последним полем.

Примечания

  1. Как Эд Нортон умело заметил, мы могли бы просто не захватывать группу и удалить прежнюю часть regex. Это можно сделать так же легко, как

    sed 's/.* //' файл

    Что заметно менее сложно и более элегантно.

  2. Для получения дополнительной информации смотрите man sed и man awk.

Используя grep:

$ grep -o '[^[:blank:]]*$' файл
UID
UID

-o говорит grep выводить только подходящую часть. Regex [^[:blank:]]*$ соответствует последнему слову в строке.

Ответ или решение

Чтобы удалить всё, что предшествует последнему пробелу в каждой строке текстового файла, можно воспользоваться утилитами Linux, такими как awk, sed, и другим встроенным инструментарием. Ниже приведены несколько методов, которые помогут вам достичь этой цели.

1. Использование awk

awk — мощное средство для обработки текстовых файлов, которое позволяет легко извлекать данные из строк.

awk '{ print $NF }' файл

Объяснение команды:

  • $NF — это встроенная переменная в awk, представляющая последнее поле строки. При выполнении команды будет выведено только последнее слово (или UID в вашем случае) для каждой строки файла.

2. Использование sed

sed — это инструмент для обработки и манипуляции текстом на основе регулярных выражений. Вы можете использовать следующую команду для удаления текста перед последним пробелом:

sed 's/.* //' файл

Объяснение команды:

  • .* обозначает все символы до последнего пробела, включая его. Команда s/.../.../ заменяет найденную часть (всё до последнего пробела) на пустую строку, оставляя только последнее поле.

3. Использование cut и rev

Можно также использовать комбинацию cut и rev. Эта методика заключается в обращении строки, извлечении первого поля и повторном обращении строки:

rev файл | cut -d ' ' -f1 | rev

Объяснение команды:

  • rev файл — переворачивает строки.
  • cut -d ' ' -f1 — извлекает первое поле (которое стало последним после реверса).
  • rev — снова переворачивает строку, возвращая ее в исходное состояние.

4. Использование grep

С помощью grep также можно выделить последнее слово в каждой строке:

grep -o '[^[:blank:]]*$' файл

Объяснение команды:

  • -o — указывает grep выводить только соответствующую часть строки.
  • [^[:blank:]]*$ — регулярное выражение, которое находит последнее слово строки, не содержащее пробелов.

Заключение

В зависимости от ваших предпочтений и сложности ваших данных, вы можете выбрать один из перечисленных выше способов. Все они помогут вам эффективно удалить все, что находится перед последним пробелом в каждой строке текстового файла, обеспечивая сохранение только UIDs. Эти команды могут быть легко адаптированы для использования в скриптах Bash, что делает их особенно полезными при автоматизации обработки данных.

Оцените материал
Добавить комментарий

Капча загружается...