-2
votes

Bash shell obtenir n nombre de lignes compte tenu des numéros en double comme un

Supposons que j'ai un fichier avec les numéros suivants: xxx

alors je veux obtenir spécifique (dire n = 4) les premiers numéros du fichier compte tenu des duplicats comme un.
Par conséquent, la sortie devrait être comme celle-ci xxx


5 commentaires

Les chiffres sont-ils un par ligne, tous en une ligne ou peuvent se propager plusieurs lignes?


Avez-vous essayé quelque chose? Cherché ? À quel moment avez-vous échoué?


Qu'attendez-vous comme sortie si n = 4 et 127 existe 2 fois plus de fois dans le fichier? Vous arrêtez votre sortie avec un seul 127 ou imprimez-vous toutes les occurrences de 127 ? L'entrée sera-t-elle toujours triée ou si l'un des premiers numéros NTH apparaîtra plus loin dans le fichier (c.-à-d. Avons-nous besoin de rechercher dans l'ensemble du fichier pour toutes les occurrences de la Premier n nombres distincts)?


@ Dash-O & Gilles Quot, j'ai des chiffres un par ligne. , J'ai essayé de trier "file1.dat" | UNIQ -C Mais elle reçoit un nombre de survenue de chaque numéro. Je veux la sortie comme je l'ai mentionnée ci-dessus.


@ markp-fuso oui j'ai besoin de toutes les occurrences de 127


3 Réponses :


1
votes

Ceci peut être fait comme suit:

  • Trier d'abord le fichier
  • Ne prenez alors que les différentes valeurs (supprimez les duplicats)
  • à partir de cela, ne prenez que les 4 premiers
  • Utilisez ces valeurs comme une entrée pour "Grepping" le fichier d'origine (il y a beaucoup de messages sur la manière de Grep un fichier sur le contenu d'un autre fichier)

0 commentaires

0
votes

Vous pouvez faire comme ça: xxx xxx

Mind the Double citations Pour évaluer l'expression à l'intérieur de citations.


5 commentaires

Cela fonctionne mais avec des chiffres triés. Si les chiffres ne sont pas triés dans l'ordre que le résultat ne sont pas souhaités. J'ai inclus la commande de tri comme ceci, mais cela donne une erreur. SED "/ fichier de tri de chat1 | UNIQ | SED '4Q; d' / q" fichier1


Essayez comme ça - sed "/` filet chat1 | Trier | Uniq | SED '4Q; d'`/ q" fichier1


Il y a aussi un problème si j'ajoute plus 127. Maintenant, mon entrée devient 123 123 125 126 126 127 127 128 130 131 132 133 134 Mais la sortie est de 123 123 125 126 126 127 au lieu de 123 123 125 126 126 127 127


Je ne sais pas s'il y a une meilleure solution, mais vous pouvez faire correspondre la 5ème ligne au lieu de 4ème, puis supprimer la dernière ligne comme SED "/` chat file1 | Trier | Uniq | SED '5Q; / q "file1 | sed '$ d'


@Manks a beaucoup pour aider. Pouvez-vous me dire comment puis-je obtenir les 4 matchs suivants, comme ceci, jusqu'à ce que je atteigne la fin du fichier. Je veux dire si j'ai une longue liste de nombres que je reçois les quatre premiers numéros souhaités à l'aide de SED "/ Fichier CAT1 | Trier | Uniq | SED '4Q; D' / q" File1. Ensuite, comment je reçois le numéro souhaité suivant et ainsi de suite. Enfin, sinon exactement 4 chiffres sont laissés, alors comment puis-je y faire face.



0
votes

Hypothèses:

  • Les données de source peuvent ne pas être triées (numériquement); Bien que les données exemplaires fournies ne semblent être triées (numériquement), des commentaires de l'OP sur l'utilisation de Trier code> me font penser que les données ne peuvent pas être triées li>
  • op veut tirer le xth code> via YTH code> (basé sur le tri numérique); Question originale demande 4 premiers code> des données avec la réponse souhaitée figurant sur Afficher les plus petits numéros code> 4 CODE> les plus petits (1ème au 4ème numéros); Commentaire supplémentaire de OP demande à la recherche de Suivant 4 correspondances CODE> Donc, je regarde donc une solution générale pour tirer xth code> via YTH li>
  • La sortie souhaitée doit conserver l'ordre d'origine des données d'entrée li> ul>

    Quelques données d'échantillon: P>

    $ x=5 y=8
    $ sort -un numbers.dat | sed -n "${x},${y}p" > numbers.grep
    $ cat numbers.grep
    128
    130
    131
    132
    $ grep -f numbers.grep numbers.dat
    128
    130
    131
    132
    
    $ x=9 y=20
    $ sort -un numbers.dat | sed -n "${x},${y}p" > numbers.grep
    $ cat numbers.grep     # sorted list of numbers we're interested in
    133
    134
    200
     201
    202
    203
    $ grep -f numbers.grep numbers.dat
    200                    # keep in mind this is the order in which the data appears in the source (one of the assumptions)
    202
     201
    203
    133
    134
    


0 commentaires