146 votes

Extraction des deux premiers caractères d'une chaîne (Shell Scripting)

Je suis novice chez sed et awk - je ne suis donc pas vraiment sûr de savoir quel est le moyen le plus efficace de s'y prendre.

Je cherche à extraire les deux premières lettres d'une chaîne. Je pourrais le faire si elles devaient être identiques à chaque fois, mais je n'arrive pas à comprendre comment dire,

Prenez n positions de cette chaîne à partir de cette chaîne plus grande x .

C'EST À DIRE.

USCAGoleta9311734.5021-120.1287855805 = US

213voto

paxdiablo Points 341644

Probablement la méthode la plus efficace, si vous êtes à l'aide de l' bash shell (et tu sembles l'être, en fonction de vos commentaires), est d'utiliser la sous-chaîne variante de l'expansion de paramètres:

long=USCAGol...
short=${long:0:2}
echo ${short}

Ce sera mis en short à être les deux premiers caractères de l' long. Si long plus courte que les deux personnages, short sera identique.

C'est généralement préférable si vous allez faire beaucoup (50 000 fois par rapport comme vous le mentionnez), car il n'y a pas de processus de création de surcharge. Toutes les solutions qui utilisent des programmes externes vont souffrir de cette surcharge.

Si vous voulait également s'assurer un minimum de longueur, vous pouvez pad avant d'en faire la main avec quelque chose comme:

tmpstr="${long}.."
short=${tmpstr:0:2}

Cela permettrait de s'assurer que rien de moins que deux caractères a été complété à droite avec des périodes (ou quelque chose d'autre, juste en changeant le caractère utilisé lors de la création d' tmpstr). Il n'est pas évident que vous avez besoin de cela, mais je pensais que je l'avais mis dans l'exhaustivité.


Cela étant dit, il ya un certain nombre de façons de le faire avec des programmes externes (tels que si vous n'avez pas bash disponible pour vous), parmi lesquels:

short=$(echo ${long} | cut -c1-2)
short=$(echo ${long} | head -c2)
short=$(echo ${long} | awk '{print substr ($0, 0, 2)}'
short=$(echo ${long} | sed 's/^\(..\).*/\1/')

Les deux premiers (cut et head) sont identiques pour une seule ligne de chaîne - ils fondamentalement juste vous donner en retour, les deux premiers caractères. Ils diffèrent en ce que cut vous donnera les deux premiers caractères de chaque ligne, head vous donnera les deux premiers caractères de l'ensemble de l'entrée

Le troisième utilise l' awk fonction de sous-chaîne à extraire les deux premiers caractères et le quatrième utilise sed groupes de capture (à l'aide d' () et \1) pour capturer les deux premiers caractères et remplacer l'ensemble de la ligne avec eux. Ils sont à la fois semblable cut - ils livrer les deux premiers caractères de chaque ligne dans l'entrée.

N'a plus d'importance si vous êtes sûr que votre entrée est une seule ligne, ils ont tous un effet identique.

75voto

ennuikiller Points 28005

le plus simple est

 ${string:position:length}
 

Où cela extrait $length sous-chaîne de $string à $position .

C'est une bash intégrée, donc awk ou sed n'est pas nécessaire.

36voto

Dennis Williamson Points 105818

Vous avez eu plusieurs bonnes réponses, et j'irais avec le Bash builtin moi-même, mais puisque vous avez demandé à propos de sed et awk et (presque) personne d'autre offert des solutions basées sur eux, je vous offre ces:

echo "USCAGoleta9311734.5021-120.1287855805" | awk '{print substr($0,0,2)}'

et

echo "USCAGoleta9311734.5021-120.1287855805" | sed 's/\(^..\).*/\1/'

L' awk on devrait être assez évident, mais voici une explication de l' sed d'un:

  • remplacer "s/"
  • le groupe "()" de deux caractères ".." à partir du début de la ligne "^" et suivi par n'importe quel caractère ".", a répété zéro, une ou plusieurs fois "*" (les barres obliques inverses sont nécessaires pour échapper les caractères spéciaux)
  • par "/" le contenu de la première (et seulement dans ce cas) groupe (ici, la barre oblique inverse est un échappement spéciale en référence à une correspondance sous-expression)
  • fait "/"

9voto

Dominic Mitchell Points 5719

Si vous êtes dans bash , vous pouvez dire:

 bash-3.2$ var=abcd
bash-3.2$ echo ${var:0:2}
ab
 

C'est peut-être ce dont vous avez besoin…

5voto

Ian Yang Points 201

colrm - supprime les colonnes d'un fichier

Pour laisser les deux premiers caractères, il suffit de supprimer les colonnes à partir de 3

 cat file | colrm 3
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X