Trouver tous les événement de la chaîne dans un fichier et imprimer son numéro de ligne en Perl
J'ai un gros fichier qui contient 400000 lignes, chaque ligne contient le plus grand nombre de mots-clés séparés par une tabulation.
Et aussi, j'ai un fichier qui contient la liste des mots-clés à rechercher. Dire ce fichier agir comme un coup d'oeil.
Donc, pour chaque mot-clé dans la table j'ai besoin de rechercher tous son apparition dans le fichier donné. Et doit imprimer le numéro de ligne de l'événement.
J'ai essayé cette
#!usr/bin/perl
use strict;
use warnings;
my $linenum = 0;
print "Enter the file path of lookup table:";
my $filepath1 = <>;
print "Enter the file path that contains keywords :";
my $filepath2 = <>;
open( FILE1, "< $filepath1" );
open FILE2, "< $filepath2" ;
open OUT, ">", "SampleLineNum.txt";
while( $line = <FILE1> )
{
while( <FILE2> )
{
$linenum = $., last if(/$line/);
}
print OUT "$linenum ";
}
close FILE1;
Cela donne à la première occurrence du mot clé. Mais j'ai besoin de tout l'événement et également le mot-clé doit être exactement les mêmes.
Le problème suis confronté en correspondance exacte est, par exemple, j'ai les mots "bonjour" et "hello world"
si j'en ai besoin pour correspondre à "bonjour", il renvoie le numéro de la ligne qui contient "bonjour le monde" aussi
mon script doit correspondre seulement "bonjour" et de donner son numéro de ligne.
pourriez-vous elabourate sur le dernier paragraphe? voulez-vous une recherche de "bonjour" return "hello world" ou pas?
Si je cherche bonjour tout le monde, il devrait correspondre seulement que la parole, non pas de son sous-chaîne comme bonjour .
OriginalL'auteur Sishanth | 2012-12-19
Vous devez vous connecter pour publier un commentaire.
Voici une solution qui correspond à toutes les occurrences de tous les mots clés:
keywords.txt:
search.txt:
De sortie:
Explication:
Cela crée une seule expression régulière qui correspond à tous les mots-clés les mots-clés fichier.
<$keywords>
- lorsqu'il est utilisé dans un contexte de liste, il renvoie une liste de toutes les lignes du fichier.map {chomp;qr/\Q$_\E/}
- cela supprime le saut de ligne de chaque ligne et applique le\Q...\E
citation littérale opérateur regex pour chaque ligne (Cela garantit que si vous avez un mot-clé comme "foo.bar", il permettra de traiter le point comme un caractère littéral, pas une regex métacaractère).join '|',
- joindre la liste en une seule chaîne de caractères, séparés par des caractères pipe.my $regex = qr|\b($keyword_or)\b|;
- créer une regex qui ressemble à ceci:/\b(\Qhello\E|\Qfoo\E|\Qbar\E)\b/
Cette regex va correspondre à l'un de vos mots-clés.
\b
est la limite de mot de marqueur, de sorte que seuls les mots entiers match:food
ne correspond plus àfoo
. Les parenthèses de capture le mot-clé spécifique qui correspond à$1
. C'est de cette façon que la sortie imprime le mot-clé correspondant.J'ai mis à jour la solution pour correspondre à chaque mot clé sur une ligne donnée et seulement des mots complets.
OriginalL'auteur dan1111
Est cette partie de quelque chose de plus grand? Parce que c'est un liner avec
grep
-n
obtientgrep
pour afficher les numéros de ligne de la première avant de la correspondance des lignes. Vous pouvez faireman grep
pour plus d'options.Je suppose ici que vous êtes sur linux ou un *nix système.
Vous pouvez voir un exemple avec grep
C'est bien pour un seul mot clé, mais l'OP voulait correspondre à toute une liste de mots clés à partir d'un fichier.
Une boucle while doit parvenir, mon bash n'est pas assez bon..
Mal.
grep -n -f keywords.txt filewithlotsalines.txt
prend les mots-clés à partir d'un fichier pour rechercher le fichier de grande taille.OriginalL'auteur Karthik T
J'ai une interprétation différente de votre demande. Il semble que vous pouvez maintenir une liste de numéros de ligne où certaines entrées d'une table de recherche sont trouvés sur les lignes d'un "mot clé". Voici un exemple de table de recherche:
Et délimité par des tabulations 'mot-clé' file, où plusieurs mots-clés peuvent être trouvés sur une seule ligne:
Compte tenu de ce qui précède, envisager la solution suivante:
Sortie de
SampleLineNum.txt
:Le script utilise une table de hachage de tableaux (HoA), où la clé est une entrée de la table de recherche et la valeur associée est une référence à une liste de numéros de ligne où que l'entrée a été trouvé sur les lignes d'un "mot clé". Le hachage
%lookupTable
est initialisé avec une référence à une liste vide.Chaque ligne de la "mots-clés" fichier est
split
sur la délimitation de l'onglet, et si une entrée correspondante est définie dans%lookupTable
, le numéro de la ligne estpush
ed sur la liste correspondante. Quand c'est fait, le%lookupTable
clés sont cas insensiblement triés et écrit àSampleLineNum.txt
, avec leurs correspondants de la liste des numéros de ligne où l'entrée a été trouvé, le cas échéant.Il n'y a pas de vérifications sur les noms de fichier d'entrée, donc envisager d'ajouter ceux.
Espérons que cette aide!
OriginalL'auteur Kenosis
Pour trouver toutes les occurrences, vous avez besoin de lire des mots-clés, et ensuite une boucle à travers les mots-clés pour trouver des correspondances pour chaque ligne. Voici ce que j'ai modifié pour trouver des mots clés dans la ligne en utilisant un tableau. En outre, j'ai ajouté un compteur pour compter le nombre de ligne et ensuite
si il y a un match à imprimer pour imprimer le numéro de la ligne. Votre code permet d'imprimer un article pour chaque ligne, même si il n'est pas un match.
OriginalL'auteur Glenn
Je pense qu'il ya certaines questions semblables à celle-ci. Vous pouvez consulter:
Perl: Recherche fichier texte pour les mots clés de la matrice
Comment puis-je rechercher des fichiers multiples pour une chaîne en Perl?
La Fichier::Grep module est intéressant.
OriginalL'auteur Carlisle18
comme d'autres l'avaient déjà donné quelques perl solution,je vous suggère que peut-être vous pourriez utiliser awk ici.
OriginalL'auteur Vijay