Чтобы напечатать строки, для которых последнее слово является чем-то, на ум приходит awk
:
awk '$NF == "123"' # string comparison
awk '$NF == 123' # number comparison, would also match on 0123, 123.0, 1.23e2
awk '$NF == ENVIRON["ENVVAR"]' # number comparison if both $NF and $ENVVAR
# look like numbers, string otherwise
Для awk
эти слова по умолчанию разделены пробелами -. В зависимости от реализации пробел может быть только символом пробела или табуляции, некоторые из них могут включать другие пробелы Unicode, если они классифицируются как таковые в локали. Реализацияbusybox
awk
также включает символы вертикального интервала, включая символ возврата каретки.
Если ваш файл отформатирован с использованием разделителей строк MS -DOS, то есть последовательности символов CR LF, а не просто LF, то описанное выше не будет работать, кроме как с busybox awk. И даже с busybox awk в строках вывода по-прежнему будут те проблемные управляющие символы, которых не должно быть в Unix.
Таким образом, вы должны предварительно обработать ввод с помощью dos2unix
или d2u
, чтобы преобразовать окончания строк в формат Unix.
< file.dos dos2unix | awk '$NF == 123'
Ваш входной файл выглядит так, как будто он состоит из записей, разделенных пустыми строками. Если вы хотите напечатать полные записи для номера книги, вы можете сделать:
export BOOKNUMBER=123
< file.dos dos2unix | awk -v RS= -F '\n' '
field[split($1, field, " ")] == ENVIRON["BOOKNUMBER"]'
Там мы устанавливаем разделитель записей на пустую строку для входа в режим абзаца(записи, разделенные пустыми строками ), и разделитель полей на новую строку (, также известную как LF ), поэтому первая строка каждой записи находится в$1
(первом поле ). Мы разделяем эту первую строку специальным разделителем полей " "
, который по умолчанию является словом , разбивающимся на массив field
.А затем сравнение последнего элемента этого массива(split()
возвращает количество элементов, поэтому field[split()]
— это последний элемент )с содержимым переменной окружения $BOOKNUMBER
.
Зафиксируйте цифры до и после запятой.
sed -e 's/\([0-9]\),\([0-9]\)/\1.\2/g'
Нет необходимости ставить запятую в обратную сторону, она не имеет значения в sed. Кроме того, точка не является специальной в замещающей части, поэтому обратная косая черта также не требуется.