Возврат и сопоставление экземпляров произвольного текста в файлах (плюс некоторые другие требования) - PullRequest
0 голосов
/ 12 октября 2011

У меня есть работа, которая не кажется очень сложной, но я недостаточно умен, чтобы знать, с чего начать.:)

Итак, у меня есть несколько файлов, которые содержат строки с именами на конце, что-то вроде этого:

File 001:
blahblahblahblahblah:Mrs Jane Doe
blahblahblahblahblah:John Doe
blahblahblahblahblah:Joe Bloggs

File 002:
blahblahblahblahblah:Dr Jane Doe
blahblahblahblahblah:John Doe
blahblahblahblahblah:Joe Bloggs
blahblahblahblahblah:Fred Bloggs

...

И так далее.Я хотел бы, чтобы скрипт прошел через все эти файлы и выдал следующий вывод:

John Doe
001
002
...

Fred Bloggs
002
...

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

Кроме того, это также необходимо учитывать случай Джейн Доу, где она появляется в разных местахс разными названиями.В идеале я хотел бы, чтобы выходные данные для нее были примерно такими:

Jane Doe
001 - Mrs
002 - Dr
...

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

Это то, что я могу сделать с помощью одного инструмента, такого как awk, или я смотрю как Ruby/ Python / Perl скрипт вроде работы?Если последнее, кто-то может указать мне на функции или библиотеки или что я мог бы использовать?(Я довольно посредственный в написании сценариев / программировании, но с достаточной документацией я могу в конечном итоге разобраться)

Приветствия!

Редактировать: Кажется, мне это удалосьсамостоятельно.:) Вот что я сделал на случай, если кто-нибудь столкнется с этим в будущем:

1.Я объединил все свои имена в один файл и удалил все названия, например:

cat * | \
    perl -pe 's/^(Dr |Mrs |Mr |blahblah )//ig' | \
    sort | \
    uniq -i > \
    notitles.txt

2.Я перебрал полученный файл с помощью grep:

while read name; do
    export fname="`echo $name | perl -pe 's/[\r\n]//g'`"
    echo "\n=={$fname}=="
    egrep -i "$name" * | \
        sed -E 's/\.txt:/ /g' | \
        perl -pe 's/(?<!==)$ENV{"fname"}//ig'
done < notitles.txt

И затем я получил свой список имен, как я хотел!

1 Ответ

0 голосов
/ 27 декабря 2011

Я думаю, что это довольно легко реализовать с помощью awk.
Я создаю два файла с именем ID: 001, 002. И поместите их в каталог.

$ ls *
001  002

$ gawk -F: '{sub(/^(Dr|Mrs|Mr|Miss) +/, "", $2); a[$2]=a[$2]FILENAME":"}; END{for(i in a)printf("%s:%s\n", i, a[i])}' * | sort | tr : '\n'
Fred Bloggs
002

Jane Doe
001
002

Joe Bloggs
001
002

John Doe
001
002

$ gawk -F: '
{
    if(match($2, /^(Dr|Mrs|Mr) +/, m)) {
        t = " - " substr($2, m[1, "start"], m[1, "length"])
        n = substr($2, m[0, "start"]+m[0, "length"])
    }
    else {
        t = ""
        n = $2
    }
    a[n] = a[n] FILENAME t ":"
}
END{
    for(i in a)
        printf("%s:%s\n", i, a[i])
}' * | sort | tr : '\n'

Fred Bloggs
002

Jane Doe
001 - Mrs
002 - Dr

Joe Bloggs
001
002

John Doe
001
002
...