web-dev-qa-db-fra.com

Lecture de modèles grep à partir d'un fichier

J'ai quelques gros fichiers texte et dans le fichier UNIQS.txt J'ai une liste de chaînes à grep d'un autre fichier. Le code que j'utilise est

grep -f UNIQS.txt EEP_VSL.uniqs.sam > UNIQ_templates.sam

ce qui ne fait rien - le fichier généré est vide. Mais quand je fais

grep -F -f UNIQS.txt EEP_VSL.uniqs.sam > UNIQ_templates.sam

cela fonctionne correctement. Cela m'embrouille car je ne pensais pas que grep interpréterait les entrées dans UNIQS.txt en tant que modèles d'expression régulière sans guillemets et barres obliques et ainsi de suite dans le fichier (ce qui n'est pas le cas). Est-ce le cas en général que si vous obtenez les modèles à partir d'un fichier, il pensera automatiquement qu'il s'agit de modèles d'expression rationnelle?

Modifier: Dans le UNIQS.txt fichier, il existe des chaînes séparées par des sauts de ligne du formulaire

HWI-ST365:215:D0GH0ACXX:2:1101:10034:186783

(appelés noms de modèle) et le fichier EEP_VSL... colonnes séparées par des tabulations, avec environ 14 colonnes et la première colonne est le nom du modèle, donc, fondamentalement, je veux extraire la ligne correspondant à chaque modèle du fichier.

50
sdf

L'option -f Spécifie un fichier dans lequel grep lit les modèles. C'est comme passer des modèles sur la ligne de commande (avec l'option -e S'il y en a plusieurs), sauf que lorsque vous appelez à partir d'un shell, vous devrez peut-être citer le modèle pour protéger les caractères spéciaux en cours d'expansion par le Shell.

L'argument -E Ou -F Ou -P, Le cas échéant, indique à grep dans quelle syntaxe les modèles sont écrits. Sans argument, grep attend expressions régulières de base ; avec -E, grep attend expressions régulières étendues ; avec -P (si pris en charge), grep attend expressions régulières Perl ; et avec -F, grep attend des chaînes littérales. Que les motifs proviennent de la ligne de commande ou d'un fichier n'a pas d'importance.

Notez que les chaînes sont des sous-chaînes: si vous passez a+b Comme modèle, une ligne contenant a+b+c Est mise en correspondance. Si vous souhaitez rechercher des lignes contenant exactement l'une des chaînes fournies et pas plus, passez l'option -x.

J'ai eu la même erreur, non résolue avec la bonne réponse de @gilles. En regardant de plus près dans le fichier d'entrée, j'ai trouvé 2 nouvelles lignes à la fin. Sans ceux-ci, le succès n'est nécessaire que: grep -i file_pattern_input file

(GNU grep 3.1, fichier d'entrée de plus de 5000 enregistrements, fichier de correspondance/modèle 2536, je savais que tous les 2536 doivent être dans le fichier. Avec les sauts de ligne, toutes les lignes du fichier ont été obtenues et sans seulement les 2536 lignes correspondantes)

0
th_k