2017-03-01 1 views
0

J'ai utilisé script suivant pour rechercher toutes les lignes d'un fichier dans un autre fichier et si on trouve l'impression 2ème colonne de cette ligne:grep donnant la sortie inattendue lors de la recherche mot exacte dans le fichier dans csh

#!/bin/csh 

set goldFile=$1 
set regFile=$2 

set noglob 
foreach line ("`cat $goldFile`") 
    set searchString=`echo $line | awk '{print $1}'` 
    set id=`grep -w -F "$searchString" $regFile | awk '{print $2}'` 
    echo "$searchString" "and" "$id" 
end 

unset noglob 

Or fichier est le suivant:

\$#%$%escaped.Integer%^^&[10] 
\$#%$%escaped.Integer%^^&[10][0][0][31] 
\$#%$%escaped.Integer%^^&[10][0][0][30] 
\$#%$%escaped.Integer%^^&[10][0][0][29] 
\$#%$%escaped.Integer%^^&[10][0][0][28] 
\$#%$%escaped.Integer%^^&[10][0][0][27] 
\$#%$%escaped.Integer%^^&[10][0][0][26] 

et RegFile est la suivante:

\$#%$%escaped.Integer%^^&[10] 1 
\$#%$%escaped.Integer%^^&[10][0][0][31] 10 
\$#%$%escaped.Integer%^^&[10][0][0][30] 11 
\$#%$%escaped.Integer%^^&[10][0][0][29] 12 
\$#%$%escaped.Integer%^^&[10][0][0][28] 13 
\$#%$%escaped.Integer%^^&[10][0][0][27] 14 
\$#%$%escaped.Integer%^^&[10][0][0][26] 15 

sortie est à venir:

\$#%$%escaped.Integer%^^&[10] and 1 10 11 12 13 14 15 
\$#%$%escaped.Integer%^^&[10][0][0][31] and 10 
\$#%$%escaped.Integer%^^&[10][0][0][30] and 11 
\$#%$%escaped.Integer%^^&[10][0][0][29] and 12 
\$#%$%escaped.Integer%^^&[10][0][0][28] and 13 
\$#%$%escaped.Integer%^^&[10][0][0][27] and 14 
\$#%$%escaped.Integer%^^&[10][0][0][26] and 15 

Mais la sortie est attendue:

\$#%$%escaped.Integer%^^&[10] and 1 
\$#%$%escaped.Integer%^^&[10][0][0][31] and 10 
\$#%$%escaped.Integer%^^&[10][0][0][30] and 11 
\$#%$%escaped.Integer%^^&[10][0][0][29] and 12 
\$#%$%escaped.Integer%^^&[10][0][0][28] and 13 
\$#%$%escaped.Integer%^^&[10][0][0][27] and 14 
\$#%$%escaped.Integer%^^&[10][0][0][26] and 15 

S'il vous plaît aidez-moi à comprendre comment rechercher mot exact ayant un certain caractère spécial à l'aide grep.

+2

'bash' et' csh' sont deux coques différentes, ne vous attendez pas à ce qu'il soit en corrélation, supprimez l'étiquette qui n'est pas pertinente ici. – Inian

+0

@Inian Je viens de partager un cas d'échec. les deux fichiers contiennent beaucoup de valeurs. –

+0

L'échec est dû au fait que le drapeau '-F' fixe les chaînes, la ligne' \ $ #% $% escaped.Integer% ^^ & [10] 'dans le fichier or correspond à toutes les lignes d'entrée du fichier reg. – Inian

Répondre

1

csh et bash sont des variantes complètement différentes de shell. Ils ne sont même pas censés être compatibles. Votre problème est plus associé à l'utilisation de grep

En raison du drapeau -F dans grep qui permet à votre chaîne à motif fixe, susceptible de contenir toutes sortes de caractères spéciaux regex comme ,, [], (), ., * , ^, $, -, \

le résultat d'erreur est parce que le drapeau -F, la ligne \$#%$%escaped.Integer%^^&[10] dans le fichier Gold correspond à tous les i lignes d'entrée sur le RegFile.

Donc, normalement, les mots exacts de recherche peuvent être filtrés par les constructions limite de mot ^ et $ dans le cadre du modèle, mais il ne fonctionnera pas dans votre cas à cause du drapeau -F, --fixed-strings ils seront traités comme faisant partie de la chaîne de recherche.

Donc, en supposant à partir du fichier d'entrée, il pourrait y avoir seulement une correspondance pour chaque ligne dans le fichier Gold-RegFile vous pouvez arrêter la recherche grep après le premier coup

Utilisation du drapeau -m1 qui, selon la page man grep dit,

-m NUM, --max-count=NUM 
      Stop reading a file after NUM matching lines. If the input is standard input 
      from a regular file, and NUM matching lines are output, grep ensures that the 
      standard input is positioned to just after the last matching line before 
      exiting, regardless of the presence of trailing context lines. 

donc l'ajouter comme,

grep -w -F -m1 "$searchString" $regFile 

devrait résoudre votre problème.

+1

Cela a fonctionné pour moi. Merci beaucoup. –