Я хочу выполнить grep для файла A для каждой фразы в файле B, где фраза представляет собой строку слов длиной X. В идеале это будет приблизительный grep, такой как agrep . Есть ли способ сделать это с помощью инструментов командной строки?

Файл А:

«Однажды я услышал историю о бананах в космосе».

Файл Б:

«Если есть одна вещь, которая меня не касается, то бананы в космосе не так важны».

Выход:

Фраза "бананы в космосе" найдена в файле A, строка 1, в файле B, строка 1.

(и это может выделить фразу в контексте, как это делает grep.)

3 ответа3

1

Вы можете попробовать следующее в bash:

while read line  
do  
   grep "$line" fileA  
done < fileB
1

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

$ cat fts.awk
{ gsub( /[[:space:],."!?]+/, " ") }

FILENAME == "A" {
   A[++cntA] = $0
   next
}

FILENAME == "B" {
   for ( nrA=1; nrA<=cntA; ++nrA) {
      for ( first=1; first<=NF; ++first) {
         for ( last=first; last<=NF; ++last) {
            lookfor = (last == first) ? $first : lookfor " " $last
            #print "lookfor=", lookfor
            #print "<", A[nrA]
            if ( index(A[nrA], lookfor)) {
               #print "FOUND>", found, nrA, NR
               found = lookfor
            } else if (found) {
               printf "Phrase \"%s\" found in File A line %d, file B line %d.\n",\
                   found, nrA, FNR
               found = ""
               break
            }
         }
      }
   }
}

Который можно назвать как:

$ awk -f fts.awk A B
Phrase "bananas in space" found in File A line 1, file B line 1.
Phrase "in space" found in File A line 1, file B line 1.
Phrase "space" found in File A line 1, file B line 1.

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

0

Позволяет немного упростить это, а затем довести до ума.

Вы можете получить файл с образцами из файла, используя опцию -f. Так что вы могли бы сделать что-то вроде этого.

grep -f file_patterns file_haystack

Вы можете использовать подстановку процесса, чтобы вывод процесса действовал как файл

cat <( grep pattern file )

Если вы соберете это вместе, вы можете создать файл grep на основе вывода команды grep, подобной этой.

grep -f <( grep pattern file_a ) file_b

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .