Je souhaite utiliser l'espace comme délimiteur avec la commande cut
.
Quelle syntaxe puis-je utiliser pour cela?
cut -d ' ' -f 2
Où 2 est le numéro du champ délimité par des espaces que vous souhaitez.
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}'
Vous pouvez également dire
cut -d\ -f 2
notez qu'il y a deux espaces après la barre oblique inverse.
Je viens de découvrir que vous pouvez également utiliser "-d "
:
cut "-d "
$ 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 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.
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
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 ligneEn 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
.