Como definir o delimitador 'tab' com 'cut' no BASH?

215

Aqui está um exemplo de como usar cutpara quebrar a entrada em campos usando um delimitador de espaço e obter o segundo campo:

cut -f2 -d' '

Como o delimitador pode ser definido como uma guia, em vez de um espaço?

Muhammad Hasan Khan
fonte
4
Tab é um delimitador padrão. cortar -f 2
Melah

Respostas:

301

Dois caminhos:

Pressione Ctrl+ Ve depois Tab.

cut -f2 -d'   ' infile

ou escreva assim:

cut -f2 -d$'\t' infile
Birei
fonte
10
$ '' - bash'ism, AFAIR
poige 30/03
8
Nem funciona no Windows (por exemplo, Git Bash) obviamente. Use a resposta de @ Mikel lá (o delimitador padrão é tab, simplesmente omita o -dargumento).
Ahmed Fasih 4/11
4
@ Poige, isso vem ksh93, não bash. Isso é suportado pelo ksh93, zsh, bash, mksh e FreeBSD sh pelo menos ( pode chegar à próxima grande reversão da especificação padrão POSIX parash ).
Stéphane Chazelas
3
@micurb Isso é ANSI-C citando: gnu.org/software/bash/manual/html_node/ANSI_002dC-Quoting.html
wisbucky
191

Tab é o padrão.

Veja a página do manual de corte .

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

Então você deveria escrever

cut -f 2
Mikel
fonte
2
Opa não percebeu essa linha.
Muhammad Hasan Khan
4
Mas é provavelmente sempre mais seguro mencionar essas bandeiras explicitamente, tanto para legibilidade quanto para portabilidade. Eu posso imaginar que algumas pessoas projetando um cutpara Windows não seguiriam o padrão completo.
Willem Van Onsem
3
Esta resposta deve ser aceita: código mais simples, explicação mais simples. você conseguiu: youtube.com/watch?v=dpNTHl7y45Y
neuronet
5
Esta resposta mudou minha vida
matheeeny
1
@WillemVanOnsem, se alguém escreve uma versão do cutWindows e não segue a especificação POSIX , não há razão para supor que qualquer script POSIX funcione com esse sistema. Atenha-se aos recursos especificados pelo POSIX. Não tente permitir futuras implementações hipotéticas não compatíveis; não é isso que "portabilidade" significa.
Curinga
12
awk -F '\t' '{ print $2 }' inputfile

Isso extrai o segundo campo delimitado por tabulação de cada linha de entrada inputfile.

Iľja
fonte
10

Mais genericamente, sem a necessidade de caracteres invisíveis: use trpara converter os delimitadores em um formato que possa ser especificado mais facilmente cut.

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

tr é uma ferramenta simples, mas poderosa, de correspondência e substituição de caracteres.

nobar
fonte
1
Mas e se a entrada for abc(space)def(tab)ghi? Sua resposta vai render def, mas deve render ghi. Da mesma forma, se a entrada for ABC(tab)DEF(space)GHI, sua resposta renderá DEF, mas deverá render DEF(space)GHI.
G-Man
@ G-Man: O delimitador de espaço foi apenas um exemplo. Use o delimitador apropriado para seus dados - uma vírgula, por exemplo. echo -e "abc\tdef ghi" |tr '\t' ',' |cut -d',' -f2
nobar 26/03
... Mas, sim, se o delimitador precisar ser uma guia, minha abordagem não funcionará.
nobar 27/03