2017-03-31 2 views
-1

J'ai deux fichiers au format de cette façon:entrée pour `division Canalisé bc` génère des nombres aléatoires

Fichier1:

word token occurence 

Fichier2:

token occurence 

Ce que je veux est un troisième fichier avec cette sortie:

word token occurrence1/occurence2 

Voici mon code:

while read token pos count 
do 
    #get pos counts 
    poscount=$(grep "^$pos" $2 | cut -f 2) 
    #calculate probability 
    prob=$(echo "scale=5;$count/$poscount" | bc -l) 
    #print token, pos-tag & probability 
    echo -e "$token\t$pos\t$prob" 
done < $1 

Le problème est que ma sortie est quelque chose comme ceci:

- : .25000 
: : .75000 
' '' 1.00000 
0 CD .00396 
1000 CD .00793 
13 CD .00793 
13th JJ .00073 
36 
29 
16 CD .00396 
17 CD .00396 

Il y a des lignes avec des chiffres que je ne sais pas d'où ils viennent, ils ne sont pas dans les fichiers précédents.

Pourquoi ces chiffres apparaissent-ils? Y a-t-il un moyen de supprimer ces lignes? Merci d'avance!

+0

Quels sont e Les vrais noms de fichiers? Double citez les variables de sécurité: '" $ 2 "'. – choroba

+1

Pourquoi ne publiez-vous pas certaines lignes des vrais fichiers? Avez-vous essayé de déboguer votre propre script en utilisant des astuces telles que l'option '-x' ou' echo -e "> $ jeton <\t> $ count <\t> $ postcount <" '? En d'autres termes, comment pouvez-vous être si sûr que c'est la division qui '' génère des nombres aléatoires'' quand vous n'avez pas inspecté les valeurs 'count' et' postcount'? – Jdamian

+0

Probablement le coupable: 'grep"^$ pos "$ 2 | coupe -f 2'; Si plusieurs lignes commencent par une valeur particulière de '$ pos', alors' grep' les trouverait toutes. – agc

Répondre

0
  1. Méthode utilisant paste, cut, & dc:

    echo "5 k $(paste file[12] | cut -f 3,5)/p" | dc | \ 
    paste file1 - | cut --complement -f 3 
    
  2. Méthode utilisant bash, paste & dc:

    paste <(join -1 2 file1 -2 1 file2 -o 1.1,1.2) \ 
        <(echo "5 k $(join -1 2 file1 -2 1 file2 -o 1.3,2.2)/p" | dc)