Вопрос или проблема
У меня есть файл с форматом, похожим на этот:
Имя Фамилия UID
Имя Отчество Фамилия UID
В основном некоторые имена имеют отчества (а иногда больше одного отчества). Я просто хочу файл, который содержит только UID.
Есть ли команда sed или awk, которую я могу выполнить, чтобы удалить все, что находится перед последним пробелом?
awk
Выведите последнее поле каждой строки с помощью awk.
Последнее поле индексируется с помощью переменной NF
, которая содержит количество полей для каждой строки. Мы индексируем его с помощью знака доллара, и получившаяся однострочная команда проста.
awk '{ print $NF }' файл
rs, cat & tail
Другой способ — транспонировать содержимое файла, затем взять последнюю строку и снова транспонировать (это довольно легко понять).
Получившаяся команда:
cat файл | rs -T | tail -n1 | rs -T
cut & rev
Используя cut и rev
, мы также можем достичь этой цели, перевернув строки, вырезав первое поле и затем снова перевернув его.
rev файл | cut -d ' ' -f1 | rev
sed
Используя sed, мы просто удаляем все символы до тех пор, пока не будет найден пробел, с помощью regex ^.* [^ ]*$
. Этот regex означает, что нужно найти начало строки ^
, за которым следует любая последовательность символов .*
и пробел . Остальная часть — это последовательность непробельных символов
[^ ]*
до конца строки $
. Однострочная команда sed:
sed 's/^.* \([^ ]*\)$/\1/' файл
Где мы захватываем последнюю часть (между \(
и \)
) и подставляем ее обратно для всей строки. \1
означает первую захваченную группу, которая является последним полем.
Примечания
-
Как Эд Нортон умело заметил, мы могли бы просто не захватывать группу и удалить прежнюю часть regex. Это можно сделать так же легко, как
sed 's/.* //' файл
Что заметно менее сложно и более элегантно.
-
Для получения дополнительной информации смотрите
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, что делает их особенно полезными при автоматизации обработки данных.