Suppression de lignes dans un document texte se terminant par le même

0

Nous avons un script qui télécharge une liste de domaines que notre calmar peut bloquer, mais nous continuons à recevoir des avertissements tels que:

2015/03/02 17:08:47| WARNING: You should probably remove '.artnau.com' from the ACL named 'chat_domains'
2015/03/02 17:08:47| WARNING: '.artnau.com' is a subdomain of '.css.artnau.com'
2015/03/02 17:08:47| WARNING: because of this '.css.artnau.com' is ignored to keep splay tree searching predictable
2015/03/02 17:08:47| WARNING: You should probably remove '.artnau.com' from the ACL named 'chat_domains'
2015/03/02 17:08:47| WARNING: '.chatserve.com' is a subdomain of '.eagles.chatserve.com'
2015/03/02 17:08:47| WARNING: because of this '.eagles.chatserve.com' is ignored to keep splay tree searching predictable

Existe-t-il un moyen de parcourir le fichier et de supprimer les sous-domaines des domaines existants de la liste?

Alors prenez la première ligne et vérifiez s'il y a d'autres lignes dans le texte qui se terminent par ce texte et supprimez-le?

Andrew
la source
Pouvez-vous poster une partie du fichier, y compris les lignes en conflit?
Tim
Il s’agit d’un document texte de 15 000 lignes qui répertorie simplement les noms de domaines à bloquer par squid. Voici un lien vers le fichier: pastebin.com/6mLB2KfZ
Andrew
Fondamentalement, il aurait une liste comme celle-ci: .artnau.com .css.artnau.com .chatserve.com .eagles.chatserve.com Ce serait génial (par exemple) d’obtenir .chatserve.com de la liste et de supprimer tout autre lignes dans le texte qui se terminent par .chatserve.com (mais conservez la ligne d'origine)
Andrew

Réponses:

1

Voici comment vous le feriez en Perl:

$ cat a.txt
.artnau.com
.bar.foo.example.org
.chatserve.com
.css.artnau.com
.eagles.chatserve.com
.example.com
.foo.example.org
$ cat a.txt | perl -ne 'BEGIN { my %h; } $h{$_} = ""; END { foreach (keys %h) { $orig = $_; $_ =~ s/^\..*?\./\./; print $orig if not exists $h{$_} } }' | sort > b.txt
$ cat b.txt 
.artnau.com
.chatserve.com
.example.com
.foo.example.org

Perl one-liner effectue une boucle a.txtet ajoute chaque ligne à un hachage nommé %h. Une fois que chaque ligne du fichier est ajoutée, il parcourt toutes les clés du hachage, supprime la première partie du domaine (la première période jusqu'à la seconde période) et, si la chaîne résultante n'est pas dans le hachage, l'affiche. La sortie est ensuite acheminée sort(vous pouvez probablement deviner ce que cela fait) et enregistrée b.txt.

Tim
la source
S'il vous plaît excuser mon vilain Perl, je suis sûr qu'il existe une solution plus élégante.
Tim
L' inutilecat est plus offensant.
Tripleee
1
@tripleee Donc tu es plus une dogpersonne?
Tim
Merci pour cela ... y at-il un moyen de faire l'action sur le fichier lui-même (sans créer un nouveau fichier)?
Andrew
De plus, j'ai besoin d'exécuter cette commande sur chaque fichier appelé domaine dans une arborescence de répertoires ... J'ai essayé find BL -name "domains" -print0 | xargs -0 -I file cat file | perl -ne 'BEGIN { my %h; } $h{$_} = ""; END { foreach (keys %h) { $orig = $_; $_ =~ s/^\..*?\./\./; print $orig if not exists $h{$_} } }' | sort > file2mais cela m'a donné une ligne dans un fichier appelé fichier2.
Andrew