Только для справки, поскольку @Nils предположил, что я использую sed
добавить a bell
к каждой строке.
sed
строка обеспечивается @Gilles
sed -e $'s/$/\a/'
работы над моим Mac (я включил "слышимый звонок" и "визуальный звонок" в моем Terminal\preferences\advanced).
Используя 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
, но это потенциально опасно в случае, если другие работают.
Можно попробовать 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) или объединение (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
grep -F -x -f B A | head -n 1
Я предполагаю, что это не известная функция grep, но можно передать несколько шаблонов через единственный файл путем помещения каждого на его собственную строку. Это главным образом полезно в сочетании с -F
искать точные строки (с -E
, эффект совпадает с несколькими шаблонами, разделенными с |
).
Я не сравнил этого, но я ожидал бы, что это будет о том, с такой скоростью, как это добирается, не делая предварительно обрабатывающий на A.