2013-05-31 3 views
1

Этот вопрос является расширением направления предыдущего question. Мои требования поиска представлены нижеРекурсивный поиск нескольких объектов из нескольких строк

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

string1 1 
string2 3 
string3 5 
  • где первый column (string1, string2, string3) указывают строки, которые необходимо искать в , а во втором столбце указывается число входов, которые нужно искать.
  • Далее необходимо поиск будет выполняться рекурсивно для файлов с определенным расширением файлов (например, .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, который предоставляется в этом предыдущем question, чтобы удовлетворить мои текущие требования поиска.

+1

Не могли бы вы уточнить, что вы подразумеваете под номером вхождений, которые нужно искать? Это за файл? на строку? –

+0

Привет, например, значение value1 нужно искать только для первого появления в файле. value2 необходимо искать первые три вхождения и значение 3 для первых 5 вхождений. – WanderingMind

+0

Поместите некоторый входной сигнал SMALL и ожидаемый выход. –

ответ

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\)$") 

Объяснение:

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

+1

В соответствии с моими предложениями по обучению: я начал [здесь] (http://bashshell.net/stream-filtering-utilities/exercise-1-learning-awk-basics/) и закончил учебник. Затем я начал читать и отвечать на вопросы по SO под этим тегом. Я очень рекомендую всем, кто хочет узнать «awk», начать делать то же самое. На этом сайте есть куча экспертных «awkers», которые помогут вам на ходу. Кроме того, чем больше людей участвует в этом сайте, тем меньше работы я должен делать. Вот еще [ссылка] (http://awk.info/?Learn). НТН. – Steve

+0

@Steve - Он работает как шарм :). спасибо – WanderingMind

Смежные вопросы