web-dev-qa-db-fra.com

utiliser l'espace comme délimiteur avec la commande cut

Je souhaite utiliser l'espace comme délimiteur avec la commande cut.

Quelle syntaxe puis-je utiliser pour cela?

267
Jaelebi
cut -d ' ' -f 2

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

305
RichieHindle

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 avec des espaces. (et la recherche sur Google qui me conduit ici)

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

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

Ou 

awk '{print $2}'
134
BeniBela

Vous pouvez également dire

cut -d\  -f 2

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

33
Chas. Owens

Je viens de découvrir que vous pouvez également utiliser "-d ":

cut "-d "

Tester

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

scut , un utilitaire semblable à une coupe (plus intelligent mais plus lent que j’ai créé) qui peut utiliser n’importe quelle expression rationnelle Perl comme marque 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

ainsi, la commande ci-dessus séparerait les colonnes avec des espaces et extrairait les colonnes 6 2 8 7 (basées sur 0) dans cet ordre. 

3
Harry Mangalam

Vous ne pouvez pas le faire facilement avec cut si les données comportent 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
2
Anssi

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

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

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

Le \1 renvoie 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 pensez peut-être, pourquoi vous embêtez? 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 sed.

0
Stephen Quan