2 votes

Trouver le préfixe le plus long dans le fichier ?

Par exemple, le fichier a.txt :

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

Donnez votre contribution et les résultats attendus sont :

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

Est-ce possible en utilisant uniquement des commandes Shell ou grep , sed , awk etc.

3voto

Damian Powell Points 315

Une façon de le faire est d'inverser l'idée de savoir quelle est l'entrée et d'utiliser a.txt comme les modèles à rechercher et ce que vous appelez "entrée" (je vais appeler "fichier2") comme ce qui est recherché. sur :

grep -o -f a.txt file2

ou

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

Ceux-ci ne donneront rien pour "/dog", bien que l'option echo aura un code de retour non nul.

Edita:

Cela correspondra davantage au résultat que vous souhaitez obtenir :

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

Vous pouvez forcer les modèles de recherche à commencer au début de la ligne comme ceci :

grep -o -f <(sed 's/^/^/' a.txt) file2

1voto

Cela semble être un travail pour Perl, alors voici une solution en awk. Minimalement testée.

#!/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)"; }
}' "$@"

0voto

mrucci Points 9408

Un simple Shell Shell devrait faire l'affaire :

#!/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"

Vous pouvez l'utiliser comme :

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

et il imprimera la correspondance la plus longue de la requête /abc/dog trouvé dans le fichier a.txt, c'est à dire /abc/d

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X