Оптимизация grep (или использование AWK) в сценарии оболочки - PullRequest
4 голосов
/ 12 мая 2010

В моем сценарии оболочки я пытаюсь искать, используя термины, найденные в $ sourcefile, по одному и тому же $ targetfile снова и снова.

Мой $ sourcefile отформатирован так:

pattern1
pattern2
etc...

Неэффективный цикл, с которым я должен искать:

for line in $(< $sourcefile);do
    fgrep $line $targetfile | fgrep "RID" >> $outputfile
done

Я понимаю, что можно было бы улучшить это либо загрузкой всего $ targetfile в память, либо, возможно, с помощью AWK?

Спасибо

Ответы [ 3 ]

7 голосов
/ 13 мая 2010

Я что-то упустил, или почему не просто fgrep -f "$sourcefile" "$targetfile"?

2 голосов
/ 12 мая 2010

Использование awk для чтения в исходном файле и затем поиск в целевом файле (не проверено):

nawk '
    NR == FNR {patterns[$0]++; next}
    /RID/ {
        for (pattern in patterns) {
            # since fgrep considers patterns as strings not regular expressions, 
            # use string lookup and not pattern matching ("~" operator).
            if (index($0, pattern) > 0) {
                print
                break
            }
        }
    }
' "$sourcefile" "$targetfile" > "$outputfile"

Будет также с gawk.

2 голосов
/ 12 мая 2010

Сед раствор:

sed 's/\(.*\)/\/\1\/p/' $sourcefile | sed -nf - $targetfile

Это преобразует каждую строку $ sourcefile в команду сопоставления с шаблоном sed:

MatchString

до

/ MatchString / р

Однако вам нужно экранировать специальные символы, чтобы сделать это устойчивым.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...