Рекурсивный поиск нескольких вхождений нескольких строк

Этот вопрос является продолжением предыдущего вопроса. . Мои требования к поиску приведены ниже

Несколько строк, которые необходимо найти, хранятся в файле values.txt (входной файл), который, например, содержит следующую информацию.

string1  1
string2  3
string3  5
  • где первый столбец (строка1, строка2, строка3) указывает строки, которые необходимо найти, а второй столбец указывает количество вхождений для поиска.
  • Далее поиск необходимо выполнять рекурсивно по файлам с определенным расширением (например, .out, .txt и т. д.).
  • Результат поиска должен быть направлен в файл, где результаты поиска печатаются вместе с именами файлов и их путем.

Например, типичный вывод должен выглядеть так, как показано ниже (для рекурсивного поиска имен файлов с расширением .out).

<path_of_searched_file1/fileName1.out>
The full line containing the <first> instance of <string1>
The full line containing the <first> instance of <string2>
The full line containing the <second> instance of <string2>
The full line containing the <third> instance of <string2>
The full line containing the <first> instance of <string3>
The full line containing the <second> instance of <string3>
The full line containing the <third> instance of <string3>
The full line containing the <fourth> instance of <string3>
The full line containing the <fifth> instance of <string3>


<path_of_searched_file2/fileName2.out>
The full line containing the <first> instance of <string1>
The full line containing the <first> instance of <string2>
The full line containing the <second> instance of <string2>
The full line containing the <third> instance of <string2>
The full line containing the <first> instance of <string3>
The full line containing the <second> instance of <string3>
The full line containing the <third> instance of <string3>
The full line containing the <fourth> instance of <string3>
The full line containing the <fifth> instance of <string3>


and so on

Является ли использование awk лучшим способом решения этой проблемы поиска? Если это так, может ли кто-нибудь помочь мне изменить код awk, представленный в этом предыдущем вопрос, чтобы удовлетворить мои текущие требования к поиску.


person rambalachandran    schedule 31.05.2013    source источник
comment
Не могли бы вы пояснить, что вы подразумеваете под количеством поисковых запросов? Это за файл? за строку?   -  person jaypal singh    schedule 31.05.2013
comment
Привет, например, значение1 нужно искать только для первого вхождения в файле. значение2 необходимо искать для первых трех вхождений, а значение3 для первых 5 вхождений.   -  person rambalachandran    schedule 31.05.2013
comment
Опубликуйте небольшой образец ввода и ожидаемый результат.   -  person Ed Morton    schedule 02.06.2013
comment
@Morton Мортон, я отредактировал вопрос, чтобы предоставить образец ввода-вывода, который я ожидаю   -  person rambalachandran    schedule 03.06.2013
comment
У меня нет необходимой привилегии комментировать исходный вопрос, который я связал. Будет полезно, если кто-нибудь прокомментирует от моего имени исходную ветку, чтобы узнать, могут ли те же люди ответить на этот вопрос.   -  person rambalachandran    schedule 03.06.2013
comment
Как определить явление? Пожалуйста, ответьте на вопрос Джейпала. Кроме того, как бы вы отнеслись к value3 и value33?   -  person Steve    schedule 03.06.2013
comment
Я считаю, что мое использование value1 было причиной путаницы. Значение1 просто означает строку, которую мне нужно найти, которая может быть любой буквенно-цифровой комбинацией. Я изменил его на string1, чтобы избежать путаницы. Я надеюсь, что это отвечает на вопрос. Если нет, пожалуйста, дайте мне знать, что именно вы ожидаете.   -  person rambalachandran    schedule 03.06.2013
comment
Итак, вы просто ищете строку. Это ответило на мой второй вопрос. Теперь, пожалуйста, ответьте на мой первый вопрос; то есть, что происходит, когда две строки находятся в одной строке? Вы считаете один или два раза?   -  person Steve    schedule 03.06.2013
comment
Предположим, что ‹string1› и ‹string2› присутствуют в одной строке. На этом этапе достаточно последовательно искать в файлах соответствующие строки. Я полагаю, что это переведет его в подсчет один раз для ‹string1› и один раз для ‹string2›. Однако, если возможно, я бы также предпочел научиться использовать его как логику ИЛИ, которая учитывается только один раз, даже если в одной строке присутствуют две строки.   -  person rambalachandran    schedule 03.06.2013
comment
Я мог бы оставить вас реализовать эту логику ИЛИ. Я добавил решение, которое должно помочь. Он реализует большую часть того, о чем вы просите.   -  person Steve    schedule 03.06.2013
comment
@Стив Большое спасибо. Я реализую это для своих нужд через несколько часов, а затем приму ваш ответ. Также будет полезно, если вы можете указать в своем ответе на пару ссылок (желательно в Интернете) о программировании awk. Это позволит мне и, возможно, другим узнать больше о программировании на awk.   -  person rambalachandran    schedule 03.06.2013


Ответы (1)


Вот один из способов использования awk; YMMV. Беги как:

awk -f ./script.awk values.file $(find . -type f -regex ".*\.\(txt\|doc\|etc\)$")

Содержание script.awk:

FNR==NR {
    a[$1]=$2;
    next
}

FNR==1 {
    for (i in a) {
        b[i]=a[i]
    }
}

{
    for (j in b) {
        if ($0 ~ j && b[j]-- > 0) {
            print > FILENAME ".out"
        }
    }
}

В качестве альтернативы, вот однострочный:

awk 'FNR==NR { a[$1]=$2; next } FNR==1 { for (i in a) b[i]=a[i] } { for (j in b) if ($0 ~ j && b[j]-- > 0) print > FILENAME ".out" }' values.file $(find . -type f -regex ".*\.\(txt\|doc\)$")

Объяснение:

В первом блоке создайте связанный массив с первым столбцом values.file в качестве ключей и вторым столбцом в качестве значений. Второй и третий блоки читаются в найденных файлах с помощью команды find. Массив, сформированный в первом блоке, дублируется (простого способа сделать это с помощью awk нет, так что, возможно, Perl и модуль Find::File::Rule будут лучшим выбором?) для каждого найденного файла. В третьем блоке мы зацикливаемся на каждом ключе, ищем строку и уменьшаем ее значение, печатая в местоположение файла с расширением «.out».

person Steve    schedule 03.06.2013
comment
В соответствии с просьбой, мои предложения по обучению: я начал здесь и закончил обучение. Затем я начал читать и отвечать на вопросы по SO под этим тегом. Я настоятельно рекомендую всем, кто хочет изучить awk, начать делать то же самое. На этом сайте есть куча опытных «авкеров», которые помогут вам сориентироваться. Кроме того, чем больше людей делают вклад в этот сайт, тем меньше работы мне приходится делать. Вот еще один справочник. ХТН. - person Steve; 03.06.2013