Учитывая некоторое число, используйте grep для нахождения, где число принадлежит пронумерованного списка?

У меня есть число (позволяет, говорят 13), и я хочу найти, где оно принадлежало бы неполного пронумерованного списка. Вот список в качестве примера:

1
3
4
5
9
16
17
21

Очевидно, эти 13 пошли бы между 9 и этими 16, но как делают меня grep для следующего самого большого количества, учитывая, что у меня есть номер 13. т.е. Как я создал бы grep для 16, учитывая, что я имею 13?

Причина, которую я спрашиваю, состоит в том, потому что я хочу использовать sed или awk для вставки строки на основе поискового параметра, но я не могу выяснить как к grep для нахождения местоположения.

Сообщите мне, должен ли я разъясниться, поскольку мне несколько трудно объяснить.

0
задан 30 April 2015 в 23:23

3 ответа

AFAIU, который почти невозможно ПРЕДПОЛОЖИТЬ, если Вы не знаете диапазон чисел рядом с числом, Вы добрались. Например, следующее число могло быть 14, мог быть 50, мог быть 1000. Если Вы будете знать диапазон, то следующее число будет в тогда, можно сделать это легко:

$ grep -E -m 1 "1[4-9]|2[0-9]|3[0-9]|4[0-9]" file.txt
16

Здесь я ищу числа, больше, чем 13, и диапазон 14< = ЦИФРА < = 49. -m 1 гарантирует, что grep остановится после нахождения первого соответствия, в этом случае следующее число после 13 в файле.

РЕДАКТИРОВАНИЕ: , Если Вы не уверены, можно попробовать этот сценарий:

#!/bin/bash
i=14
while :; do
    grep "$i" file.txt 2>/dev/null && break || i=$((i+1))
done

Набор i как число Вы добрались плюс 1. Это пройдет файл, ищущий числа, больше, чем 13, если найдено число показывают, и операция заканчивается иначе, число будет увеличено одним, и поиск продолжится.

0
ответ дан 4 October 2019 в 07:39

Если Вы хотите, чтобы использование awk вставило что-то, то используйте его непосредственно:

awk 'flag { print "I am inserting stuff"; flag = 0} $1 > 13 && !seen {flag = 1; seen = 1} 1'

С Вашим примером:

$ awk 'flag { print "I am inserting stuff"; flag = 0} $1 > 13 && !seen {flag = 1; seen = 1} 1' foo
1
3
4
5
9
16
I am inserting stuff
17
21
0
ответ дан 4 October 2019 в 07:39

Возможно, не, что Вы хотели, но поскольку Вы на самом деле пытаетесь вставить значение, я лично добавил бы число к списку и затем использовал бы sort -n принести вещи в правильный порядок.

Такая команда могла быть похожей на это (если список находится в файле):

echo 13 | cat listfile - | sort -n | sed '/^$/d' | cat - > listfile

(Замените 13 числом, которое Вы хотите вставить, возможно, переменная x, таким образом, последовательность команды запустилась бы с echo $x |)

Для объяснения я разделю его:

  • echo 13 | производит номер 13 к stdout, который затем передается по каналу в следующую команду
  • cat listfile - | сначала берет содержание listfile, впоследствии все от stdin до EOF, и затем передает связанный результат по каналу к stdin следующих команд
  • sort -n | берет переданный по каналу список и сортирует, он принимающий числовую природу входа во внимание (как дано переключателем-n, также посмотрите man sort)
  • sed '/^$/d' | удаляет любые пустые строки из строки и вперед этого снова
  • cat - > listfile откладывает все это в listfile снова. Да, это работает в противоположность вещам как sed 's/a/b/g somefile > somefile', который освободил бы файл.

Если Вы хотите разделить его на несколько команд, можно сделать вещь укусом более четкий, всегда воздействуя на файл:

echo 13 >> listfile
sort -n listfile
sed -i '/^$/d' listfile

Это может также пригодиться, если необходимо добавить многократные въезды. Просто добавьте их всех и затем вид (который может быть быстрее, чем поиск положений вставки каждый раз).


Выше команды также работает, если Вы воздействуете на переменные. Для этого содержание var должно присутствовать как строка с помощью разделения новой строки, таким образом, это может быть отсортировано мудрое строкой.

Если значения, например, располагают с интервалами разделенный, Вы могли бы использовать следующую команду

list=$(echo $list 13 | sed -r 's/\s+/\n/g' | sort -n | sed '/^$/d')

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

1
ответ дан 4 October 2019 в 07:39

Другие вопросы по тегам:

Похожие вопросы: