Comment définir le délimiteur 'tab' avec 'cut' dans BASH?

215

Voici un exemple d'utilisation cutpour briser la saisie dans des champs à l'aide d'un séparateur d'espaces et obtenir le second champ:

cut -f2 -d' '

Comment le délimiteur peut-il être défini comme un onglet, au lieu d'un espace?

Muhammad Hasan Khan
la source
4
Tab est un délimiteur par défaut. cut -f 2
Melah

Réponses:

301

Deux façons:

Appuyez sur Ctrl+ Vpuis sur Tab.

cut -f2 -d'   ' infile

ou écrivez-le comme ceci:

cut -f2 -d$'\t' infile
Birei
la source
10
$ '' - bash'ism, AFAIR
poige
8
Ni ne fonctionne dans Windows (par exemple, Git Bash) de toute évidence. Utilisez la réponse de @ Mikel ici (le délimiteur par défaut est Tabulation, omettez tout simplement l' -dargument).
Ahmed Fasih
4
@poige, ça vient de ksh93, pas bash. Cela est au moins supporté par ksh93, zsh, bash, mksh et FreeBSD ( il pourrait en être de même pour la prochaine inversion majeure de la spécification standard POSIXsh ).
Stéphane Chazelas
3
@micurb C'est une citation ANSI-C: gnu.org/software/bash/manual/html_node/ANSI_002dC-Quoting.html
wisbucky
191

Tab est la valeur par défaut.

Voir la page de manuel de coupe .

-d delim
         Use delim as the field delimiter character instead of the tab
         character.

Donc, vous devriez juste écrire

cut -f 2
Mikel
la source
2
Oops n'a pas remarqué cette ligne.
Muhammad Hasan Khan
4
Mais il est probablement toujours plus sûr de mentionner explicitement ces drapeaux, à la fois pour la lisibilité et la portabilité. J'imagine que certaines personnes qui conçoivent cutpour Windows ne suivraient pas la norme complète.
Willem Van Onsem le
3
Cela devrait être une réponse acceptée: code le plus simple, explication la plus simple. ya cloué: youtube.com/watch?v=dpNTHl7y45Y
Neuronet
5
Cette réponse a changé ma vie
matheeeny
1
@WillemVanOnsem, si quelqu'un écrit une version cutpour Windows et ne suit pas la spécification Posix , pour elle, il n'y a aucune raison de supposer que tout script POSIX fonctionnera avec ce système. S'en tenir aux fonctionnalités spécifiées par POSIX. N'essayez pas de permettre de futures mises en œuvre hypothétiques non conformes; ce n'est pas ce que "portabilité" signifie.
Wildcard
12
awk -F '\t' '{ print $2 }' inputfile

Ceci extrait le deuxième champ délimité par des tabulations de chaque ligne d’entrée inputfile.

Iľja
la source
10

De manière plus générique, sans requérir de caractères invisibles: utilisez-le trpour convertir les délimiteurs en un format qui peut être spécifié plus facilement cut.

$ echo -e "a\tb\tc" |tr '\t' ' ' |cut -d' ' -f2
b

tr est un outil simple, mais puissant, de correspondance et de remplacement de personnage.

nobar
la source
1
Mais que faire si l'entrée est abc(space)def(tab)ghi? Votre réponse cédera def, mais elle devrait céder ghi. De même, si l'entrée est ABC(tab)DEF(space)GHI, votre réponse donnera DEF, mais elle devrait céder DEF(space)GHI.
G-Man
@ G-Man: Le délimiteur d'espace n'était qu'un exemple. Utilisez le délimiteur approprié pour vos données, par exemple une virgule. echo -e "abc\tdef ghi" |tr '\t' ',' |cut -d',' -f2
novembre
... Mais oui, si le délimiteur doit être un onglet, mon approche ne fonctionnera pas.
Nobar