Bash Shell Получить n строк, считая повторяющиеся числа одним - PullRequest
0 голосов
/ 21 июня 2020

Предположим, у меня есть файл со следующими номерами:

123
123
125
126
126
127
128
130
131
132
133
134

Затем я хочу получить определенные c (скажем, n = 4) первые числа из файла, считая дубликаты одним. Следовательно, вывод должен быть таким

123
123
125
126
126
127

Ответы [ 3 ]

1 голос
/ 21 июня 2020

Это можно сделать следующим образом:

  • Сначала отсортируйте файл
  • Затем выберите только разные значения (удалите дубликаты)
  • Только из этого взять первые 4
  • Используйте эти значения в качестве входных данных для "поиска" исходного файла (есть много сообщений о том, как выполнить поиск файла по содержимому другого файла)
0 голосов
/ 24 июня 2020

Допущения:

  • исходные данные не могут быть отсортированы (численно); в то время как предоставленные образцы данных кажутся отсортированными (численно), комментарии OP об использовании sort наводят меня на мысль, что данные могут не быть отсортированы
  • OP хочет вытащить от xth до yth числа (на основе числовой сортировки); исходный вопрос запрашивает first 4 чисел из данных с желаемым ответом, отображающим 4 наименьшие числа (ie, числа с 1-го по 4-й); дополнительный комментарий OP спрашивает о поиске next 4 matches, поэтому я ищу общее решение для вытаскивания xth через yth чисел
  • желаемый результат должен поддерживать исходный порядок входных данных

Некоторые примеры данных:

$ cat numbers.dat
123
123
125
126
126
127
127
128
130
131
200
202               # data not sorted
 201              # let's see if we can 'ignore' the leading space
203
132               # data not sorted
133
134

Для начала мы рассмотрим поиск первых 4 чисел (на основе числовой сортировки), ie, чисел от 1st до 4th. :

$ x=1 y=4                                                     # set start/end positions

$ sort -un numbers.dat                                        # get a unique list of sorted numbers
123
125
126
127
128
130
131
132
133
134
200
 201
202
203

$ sort -un numbers.dat | sed -n "${x},${y}p"                  # extract lines x=1 through y=4
123
125
126
127

$ sort -un numbers.dat | sed -n "${x},${y}p" > numbers.grep   # store desired numbers

На этом этапе у нас есть список интересующих нас чисел:

$ cat numbers.grep
123
125
126
127

Используя grep, теперь можно использовать этот список для извлечения совпадающих строк из исходный код с сохранением исходного порядка:

$ grep -f numbers.grep numbers.dat
123
123
125
126
126
127
127

Некоторые примеры с разными x и y:

$ x=5 y=8
$ sort -un numbers.dat | sed -n "${x},${y}p" > numbers.grep
$ cat numbers.grep
128
130
131
132
$ grep -f numbers.grep numbers.dat
128
130
131
132

$ x=9 y=20
$ sort -un numbers.dat | sed -n "${x},${y}p" > numbers.grep
$ cat numbers.grep     # sorted list of numbers we're interested in
133
134
200
 201
202
203
$ grep -f numbers.grep numbers.dat
200                    # keep in mind this is the order in which the data appears in the source (one of the assumptions)
202
 201
203
133
134
0 голосов
/ 21 июня 2020

Вы можете сделать это так:

sed "/`cat file1 | sort | uniq | sed '4q;d'`/q" file1
123
123
125
126
126
127

Обратите внимание на double quotes, чтобы оценить выражение внутри обратных кавычек.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...