Question

Je souhaite utiliser l'espace en tant que délimiteur à l'aide de la commande cut.

Quelle syntaxe puis-je utiliser pour cela?

Était-ce utile?

La solution

cut -d ' ' -f 2

Où 2 est le numéro du champ délimité par des espaces que vous souhaitez.

Autres conseils

Généralement, si vous utilisez un espace comme séparateur, vous souhaitez traiter plusieurs espaces comme un seul, car vous analysez le résultat d'une commande en alignant certaines colonnes sur des espaces. (et la recherche sur Google qui me conduit ici)

Dans ce cas, une seule cut commande n'est pas suffisante et vous devez utiliser:

tr -s ' ' | cut -d ' ' -f 2

Ou

awk '{print $2}'

Pour compléter les réponses utiles existantes; Un coup de chapeau à Support QZ pour m'avoir encouragé à publier une réponse distincte:

Deux mécanismes distincts entrent en jeu ici:

  • (a) si cut lui-même nécessite que le délimiteur (l'espace, dans ce cas) transmis à l'option -d soit un argument séparé ou s'il est acceptable de l'ajouter directement à -d ' '.

  • (b) comment le shell analyse généralement les arguments avant de les transmettre à la commande appelée.

(a) reçoit une citation de consignes POSIX pour les services publics (c'est moi qui souligne)

  

Si le SYNOPSIS d'un utilitaire standard affiche une option avec un argument d'option obligatoire [...], une application conforme doit utiliser des arguments distincts pour cet option et son option-argument . Toutefois, , une implémentation conforme autorise également les applications à spécifier l'option et l'argument d'option dans la même chaîne d'arguments sans caractères intermédiaires .

En d'autres termes: dans ce cas, car l'argument option de -d " " est obligatoire , vous pouvez choisir . Indiquer si le délimiteur doit être :

  • (s) SOIT: un argument séparé
  • (d) OU: en tant que valeur attachée directement à -d \<space> # <space> used to represent an actual space for technical reasons .

Une fois que vous avez choisi (s) ou (d), l’analyse littérale des chaînes du shell - (b) - est importante:

  • À l'approche (s) , tous les formulaires suivants sont équivalents:

    • -d' '
    • -d" "
    • "-d "
  • À l'approche (d) , tous les formulaires suivants sont équivalents:

    • '-d '
    • d\<space>
    • \
    • '...'
    • "..."

L'équivalence est expliquée par le traitement littéral chaîne du shell :

Toutes les solutions ci-dessus génèrent la chaîne identique (dans chaque groupe) avant que $var les voie :

  • (s) : $(...) voit `...`, en tant que son argument propre , suivi d'un argument séparé qui contient un caractère espace - sans guillemets ni $(( ... )) préfixes!.

  • (d) : <=> voit <=> plus un caractère espace - sans guillemets ni <=> préfixe! - dans le cadre de l'argument identique .

La raison pour laquelle les formulaires des groupes respectifs sont finalement identiques est double, en fonction de la façon dont le shell analyse les littéraux de chaîne :

  • Le shell permet de spécifier tel quel au moyen d'un mécanisme appelé citant , qui peut prendre plusieurs formes :
    • Chaînes entre guillemets simples: le contenu à l'intérieur de <=> est pris littéralement et forme un argument unique
    • chaînes entre guillemets doubles: le contenu de <=> forme également un argument unique , mais est sujet à une interpolation (élargit les références de variable telles que <=>, des substitutions de commandes (<=> ou <=>) ou des extensions arithmétiques (<=>).
    • <=> - citation de caractères individuels : un <=> précédant un seul caractère entraîne l'interprétation de ce caractère comme un littéral.
  • La citation est complétée par la suppression de la citation , ce qui signifie qu’une fois que le shell a analysé une ligne de commande, il supprime les guillemets des arguments (avec des instances <=> ou <=> ou <=>) - ainsi, lecommande invoquée ne voit jamais les guillemets .

Vous pouvez aussi dire

cut -d\  -f 2

notez qu'il y a deux espaces après la barre oblique inverse.

Je vient de découvrir que vous pouvez également utilisez "-d ":

cut "-d "

Test

$ cat a
hello how are you
I am fine
$ cut "-d " -f2 a
how
am

scut , un utilitaire semblable à une coupe (plus intelligent mais plus lent I made) qui peut utiliser n’importe quelle expression rationnelle perl en tant que jeton de rupture. La rupture sur les espaces est la valeur par défaut, mais vous pouvez également utiliser des expressions rationnelles multi-caractères, des expressions rationnelles alternatives, etc.

scut -f='6 2 8 7' < input.file  > output.file

afin que la commande ci-dessus décompose les colonnes sur les espaces et extrait les colonnes 6 2 8 7 (basées sur 0) dans cet ordre.

Vous ne pouvez pas le faire facilement avec couper si les données ont par exemple plusieurs espaces. J'ai trouvé utile de normaliser les entrées pour faciliter le traitement. Une astuce consiste à utiliser sed pour la normalisation comme ci-dessous.

echo -e "foor\t \t bar" | sed 's:\s\+:\t:g' | cut -f2  #bar

J'ai une réponse (j'admets une réponse quelque peu déroutante) qui implique sed, des expressions régulières et des groupes de capture:

  • \S* - premier mot
  • \s* - délimiteur
  • (\S*) - deuxième mot - capturé
  • .* - reste de la ligne

En tant qu'expression \(, le groupe de capture doit être échappé, c'est-à-dire \) et \1.

Le <=> retourne une copie du groupe capturé, c'est-à-dire le deuxième mot.

$ echo "alpha beta gamma delta" | sed 's/\S*\s*\(\S*\).*/\1/'
beta

Quand vous regardez cette réponse, cela vous semble un peu déroutant et, vous vous en doutez, pourquoi s’embêter? Eh bien, j'espère que certains pourront aller & «Aha! &»; et utilisera ce modèle pour résoudre des problèmes d'extraction de texte complexes avec une seule <=> expression.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top