Поиск повторяющихся вхождений определенной подстроки в файле

Я дам вам наглядный пример, чтобы объяснить основы X11 и то, что происходит в фоновом режиме:

X11 connections exampleисточник

В этом примере у вас есть локальный сервер X11 -с двумя «экранами» на вашем hostA. Обычно используется только один сервер с одним экраном (:0.0 ), который распространяется на все ваши мониторы (и значительно упрощает работу с несколькими -мониторами ). hostB имеет два X-сервера, где второй не имеет физического дисплея (, например. виртуальный фреймбуфер для VNC ). hostC — это безголовый сервер без каких-либо мониторов.

клемма 1а, 2а, 5а, 6а:Если вы откроете локальный терминал и установите отображение на :0.0 (по умолчанию )или :0.1, вызовы рисования для ваших графических программ будут отправлены на локальный X-сервер напрямую через память.

клемма 1b, 5b:Если вы подключаетесь по ssh к какому-либо серверу, обычно отображение автоматически устанавливается на локальный X-сервер, если он доступен. В противном случае он вообще не будет установлен (, см. клемму 3 ).

клемма 2b, 6b:Если вы подключитесь к серверу по ssh,и включить переадресацию X11 -через параметр «-X», автоматически создается туннель через соединение ssh -. В этом случае TCP-порт 6010 (6000+дисплей #)на хосте B перенаправляет трафик на порт 6000 (X-сервер #0 )на хосте A. Обычно первые 10 дисплеев зарезервированы для «настоящих» серверов, поэтому переназначение ssh отображает #10 (следующий пользователь, подключающийся с помощью ssh -X, когда вы вошли в систему, затем получит #11 ). Дополнительный X-сервер не запущен, и разрешения для X -server #0 на hostA автоматически обрабатываются ssh.

клемма 4:Если вы добавите имя хоста (, например. localhost )перед дисплеем/экраном #, X11 также будет обмениваться данными через TCP вместо памяти.

клемма 3:Вы также можете напрямую отправлять команды X11 по сети, не устанавливая предварительно туннель ssh -. Основная проблема здесь в том, что ваша сеть/брандмауэр/и т. необходимо настроить, чтобы разрешить это (будьте осторожны, X11 практически не зашифрован ), и разрешения для X-сервера должны быть предоставлены вручную (xhosts или Xauthority ).

Чтобы ответить на ваши вопросы

What are the relations and differences between X server, display and screen?

Отображение просто относится к какому-то X-серверу где-то . Термин «оба дисплея» относился к «:0.0» на локальном компьютере («локальный дисплей» ), равный «localhost :10.0» на цели ssh -(" Отображение TCP" ). «экраны» относятся к различным виртуальным мониторам (кадровым буферам )X-сервера. «localhost :10.0» перенаправляет только на локальный X-сервер, на цели ssh -X-сервер не запущен.

-3
14.07.2020, 14:44
5 ответов

В них представлены возможные подходы к решению некоторых из различных редакций вашего вопроса:

<your-file grep '^possible[[:digit:]]' | sort | uniq -d

Дает вам лексически отсортированный список повторяющихся строк, начинающихся с possible<digit>.

  • grepвыбирает строки, начинающиеся с possible, за которыми следует хотя бы одна цифра.
  • sortсортирует результат так, чтобы дубликаты были смежными (, необходимыми дляuniq).
  • uniq -dсообщает о дубликатах.

Соответствовать любому вхождению possible<digits>, где бы они ни находились во входных данных, при условии реализации GNU grepили совместимости:

<your-file grep -Po 'possible\d+' | sort | uniq -d

На входе типа:

possible123xx impossible123yy

Это дало бы:

possible123

Для всех уникальных строк, содержащих повторяющиесяpossible<digit>:

perl -lne 'if (/possible(\d+)/) {
             $count{$1}++;
             $lines{$1}->{$_}++;
           }
           END{
             for $k (grep {$count{$_} > 1} keys %count) {
               print for keys %{$lines{$k}}
             }
           }' < your-file

На входе типа:

this is the best possible solution
possible1234 solution!!!
possible5678 solution!!!
possible5678 solution!!!
possible0000 solution!
impossible0000 other solution!

Дает:

possible0000 solution!
impossible0000 other solution!
possible5678 solution!!!

(в произвольном порядке, кроме строк для заданного possibleXXXX, они будут располагаться друг за другом ).

3
18.03.2021, 23:19

Для вашего исправленного примера может работать решение на основеawk-:

awk '/possible[[:digit:]]+/ {count[$0]++;} END{for (line in count) {if (count[line]>1) print line}}' input.txt 

или, если вы awkне понимаете классы символов POSIX

awk '/possible[0-9]+/ {count[$0]++;} END{for (line in count) {if (count[line]>1) print line}}' input.txt 

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

Обратите внимание, что это будет работать только в том случае, если ваш фактический ввод соответствует показанному. Если один и тот же шаблон possibleNNNNможет быть в разных строках, это не удастся!

1
18.03.2021, 23:19

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

Сохраните регулярное выражение в переменной среды «re», затем найдите строку регулярного выражения с помощью команды match. В этих строках мы обновляем количество регулярных выражений, увиденных до этого, с помощью команды gsub.

$ re='\<possible[0-9]+\>' \
awk  'BEGIN { r = ENVIRON["re"] }
match($0, r) && 
(a[substr($0,RSTART,RLENGTH)] += gsub(r, "&")) == 2'  logfile

Один лайнер на Perl будет:

perl -lne 'print if /\bpossible(\d+)\b/ && 2 == ($h{$1} +=()= //g)' logfile
1
18.03.2021, 23:19

Вы можете попробовать использовать простую команду awk ниже

awk '{if(seen[$0]++){print $0}}' file

выход

possible5678 solution!!!
possible0000 solution!
There should be some "possible7777" solution!

Питон

#!/usr/bin/python
uni=[]
full_with_duplicate=[]
k=open('p.txt','r')
for i in k:
    if i.strip() not in uni:
        uni.append(i.strip())
t=open('p.txt','r')
for i in t:
    full_with_duplicate.append(i.strip())


for i in uni:
    if full_with_duplicate.count(i) > 1:
        print i

выход

possible5678 solution!!!
possible0000 solution!
There should be some "possible7777" solution!
1
18.03.2021, 23:19

С помощью GNU awk для \<границы слова, \wсокращения и 3-го аргумента для соответствия():

$ awk 'match($0,/\<possible\w*/,a) && ++cnt[a[0]]==2' file
possible5678 solution!!!
possible0000 solution!
There should be some "possible7777" solution!

Вы не указали, КАКУЮ строку с дубликатом ключа вы хотите вывести, поэтому приведенный выше вывод выводит вторую строку.

1
18.03.2021, 23:19

Теги

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