Найти самый длинный префикс соответствия в файле?

Например, файл a.txt:

/abc
/abc/def
/abc/xyz
/abcd
/fghi

Дайте вход, и ожидаемые результаты:

/abc/dog     => /abc
/abc/def12   => /abc/def
/dog         => (NONE)

Этот возможный использующий, только окружают команды или grep, sed, awk, и т.д. материал?

2
задан 13.12.2010, 18:18

3 ответа

Один способ сделать это - к несколько обратному идея, которой вход и использование a.txt как шаблоны для поиска и что Вы называете "входом" (я назову "file2") чтобы быть, что ищется в:

grep -o -f a.txt file2

или

echo "/abc/dog" | grep -o -f a.txt

Они ничего не произведут для "/собака", хотя echo версия будет иметь ненулевой код возврата.

Править:

Это будет более тесно соответствовать Вашему требуемому выводу:

while read -r line
do
    match=$(echo "$line" | grep -of a.txt)
    match=${match:-(NONE)}
    printf "%-12s => %s\n" "$line" "$match"
done < file2

Можно вынудить шаблоны поиска запуститься в начале строки как это:

grep -o -f <(sed 's/^/^/' a.txt) file2
4
ответ дан 08.12.2019, 05:52

Походит на задание для Perl, таким образом, вот awk решение. Минимально протестированный.

#!/bin/sh
prefixes_file=$1
shift
awk -vprefixes_file="$prefixes_file" '
BEGIN {
    while (getline <prefixes_file) { ++prefixes[$0]; }
}
{
    for (n = length; n >= 0; --n) {
        if (prefixes[substr($0,1,n)]) {
            print $0, "=>", substr($0,1,n);
            break;
        }
    }
    if (n == -1) { print $0, "=>", "(NONE)"; }
}' "$@"
1
ответ дан 08.12.2019, 05:52

Простой сценарий оболочки должен сделать задание:

#!/bin/sh

query=$1
file=$2

for i in $(seq 1 ${#query})
do
    current_query=$(echo $query | cut -b1-$i)
    grep -q "$current_query" "$file" || break;
    longest_match=$current_query
done

echo "$longest_match"

Можно использовать его как:

longest_match.sh '/abc/dog' a.txt

и это распечатает самое долгое соответствие запроса /abc/dog найденный в файле a.txt, т.е. /abc/d

0
ответ дан 08.12.2019, 05:52

Теги

Похожие вопросы