J'ai un fichier cities
comme celui-ci:
[1598] San Diego, US (inactive)
[4517] St Louis, US (inactive)
[6346] Orlando, US (inactive)
Je veux découper les noms des villes pour avoir:
San Diego
St Louis
Orlando
C'est le mieux que j'ai pu trouver:
cut -d ',' -f1 cities | cut -d ']' -f2
Mais cela me laisse encore un espace devant les noms. Existe-t-il une cut
commande similaire que je peux utiliser qui accepte les délimiteurs de plusieurs caractères afin que je puisse continuer ]
?
command-line
cut
Kit Sunde
la source
la source
tr
est utile pour supprimer les caractères dont vous ne voulez pas.(inactive)
statut ou non? Veuillez fournir un exemple de sortie.cut
pour couper les choses et que vous pouvez voir l'intention de l'exemple raté que j'ai, cela devrait être assez clair dans le contexte. Je vais cependant fournir un échantillon pour le clarifier davantage. :)Réponses:
Awk (vérifiez également Awk Info ) est magnifique avec ce genre de question. Essayer:
Cela définit un séparateur de champ
-F
comme[],] *
- ce qui signifie une occurrence d'un crochet carré de fermeture ou d'une virgule, suivie de zéro ou d'un nombre quelconque d'espaces. Bien sûr, vous pouvez changer cela pour répondre à toutes les exigences. Lisez sur les expressions régulières.Une fois la ligne divisée, vous pouvez faire ce que vous voulez avec le résultat de la division. Ici, j'ai décidé d'imprimer le deuxième champ uniquement avec
print $2
. Notez qu'il est important d'utiliser des guillemets simples autour des instructions awk sinon $ 2 est remplacé par le shell.la source
]
n'est pas un support d'angle. Les équerres sont<>
.[]
sont des "crochets" ou simplement des "crochets".Vous pouvez modifier le dernier
cut
de votre pipeline comme suit:Ce qui précède signifie que le séparateur de champs est un espace, et nous voulons sélectionner tous les champs à partir du second. La séquence complète devient:
la source
Pour une analyse plus complexe, vous devez utiliser sed (1) :
Ou en utilisant
-r
pour simplifier l'expression régulière, comme le suggère pepoluan :la source
J'utilise normalement Perl lorsque les choses deviennent trop difficiles pour sed et grep.
Il existe plusieurs façons de l'écrire en Perl. Par exemple, vous pouvez préférer qu'il soit rapide, ou vous pouvez préférer qu'il gère de légers problèmes inattendus dans l'entrée (par exemple, deux espaces où l'un était prévu).
Une façon évidente (suppose que l'id est numérique, la ville est alphabétique, le statut est alphabétique):
Ou plus lent mais plus permissif (fait plus de recul):
Ou plus rapidement (le champ s'arrête à la première occurrence du crochet de fermeture):
À partir de la ligne de commande plutôt que d'un script, vous pouvez utiliser l'
-n
option, qui ajoute essentiellement lawhile (<>) { BLOCK }
boucle:ou si vous voulez que l'utilisation ressemble à couper, vous pouvez utiliser l'
-F
option, qui est similaire à l'-F
option awk , par exemple:De cette façon, on suppose évidemment qu'aucun champ ne contiendra aucun des délimiteurs.
la source