Самый быстрый способ определить, содержат ли два отсортированных списка уникальные элементы

Только для справки, поскольку @Nils предположил, что я использую sed добавить a bell к каждой строке.

sed строка обеспечивается @Gilles

sed -e $'s/$/\a/' 

работы над моим Mac (я включил "слышимый звонок" и "визуальный звонок" в моем Terminal\preferences\advanced).

6
22.11.2011, 02:03
4 ответа

Используя comm, можно заставить сценарий возвращаться при первом использовании соответствия head и FIFO:

#!/bin/bash -e 

[ -p tmpfifo ] || mkfifo tmpfifo
comm -12 A B | head -n1 >tmpfifo &

# If this wc is zero, no matches.  Otherwise, a match was found. 
# You can use this directly in the script, echo it, 
# change the script exit value, or however else you need to use it.
wc -l tmpfifo 

В данный момент это продолжит выполнять коммуникацию в фоновом режиме, я испытываю затруднения при нахождении права PID уничтожить ($! дает head и не уничтожение comm). Если Вы уверены, что это - единственное выполнение коммуникации, Вы могли бы использовать killall, но это потенциально опасно в случае, если другие работают.

1
27.01.2020, 20:29

Можно попробовать AWK для парсинга файлов. Сначала я думал, чтобы разбить больший файл, или сохранить в мадам и пробежать B сравнение каждой строки к в мадам. Однако я думаю, что AWK мог бы быть тем, что Вы ищете.

http://www.linuxjournal.com/article/8913 является краткой информацией

http://forums.devshed.com/unix-help-35/compare-two-files-using-awk-or-sed-425150.html говорит о файле, выдерживают сравнение. Я не нахожусь на Linux прямо сейчас, или я попытался бы проверить его.

простофиля http://www.gnu.org/software/gawk/manual/html_node/index.html

1
27.01.2020, 20:29

Если файлы отсортированы, Вы можете заставлять соединение (1) или объединение (1) работать обоснованно эффективно. head -1 на выводе остановится в первой строке и должен уничтожить остальную часть команды с SIGPIPE, когда это выйдет.

Кроме того, Вы можете сокращать проблемный размер при помощи uniq (1) на большем файле A. Это сведет его к ряду отличных строк, которые могут затем быть сравнены с Вашим списком файлов B.

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

For each B file:
    Read in each line
    Add the file name to a list of files keyed on a hash of the line 

Loop through the A file:
    Look up each line in the dictionary
    Output the file name when a match is found.

Это израсходует большой объем памяти, если количество отличных строк в Ваших файлах 'B' будет большим, таким образом, оно может или не может быть практично. Если Вы не возражаете выполнять последующую обработку для устранения ложных положительных сторон, Вы могли бы сократить потребление памяти на данном этапе, просто храня хеш.

Третий путь состоял бы в том, чтобы загрузить всех в базу данных и сделать соединение, но это подвергается издержкам импорта данных, которые могут быть слишком большими. С соответствующими индексами фактический запрос соответствия был бы довольно быстр и мог проверить по всем файлам B сразу, т.е.

Create table A (
       TextLine varchar (100) -- or whatever length you need
)

Create table B (
       TextLine varchar (100)
      ,Filename varchar (20)
)

Alter table B
  add constraint PK_B
      primary key (TextLine, FileName)


select distinct B.FileName
  from A
  join B
    on a.TextLine = B.TextLine
1
27.01.2020, 20:29
grep -F -x -f B A | head -n 1

Я предполагаю, что это не известная функция grep, но можно передать несколько шаблонов через единственный файл путем помещения каждого на его собственную строку. Это главным образом полезно в сочетании с -F искать точные строки (с -E, эффект совпадает с несколькими шаблонами, разделенными с |).

Я не сравнил этого, но я ожидал бы, что это будет о том, с такой скоростью, как это добирается, не делая предварительно обрабатывающий на A.

1
27.01.2020, 20:29
  • 1
    Если OP не хочет знать, какая строка присутствует, но просто, что существует один, добавление-l должно делать выход grep, как только соответствие найдено, не читая остальную часть большого файла –  AProgrammer 22.11.2011, 10:54

Теги

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