Come definire il delimitatore 'tab' con 'cut' in BASH?


Risposte:


301

Due strade:

Premi Ctrl+ Ve poi Tab.

cut -f2 -d'   ' infile

o scrivilo così:

cut -f2 -d$'\t' infile

10
$ '' - bash'ism, AFAIR
poige

8
Né funziona in Windows (ad es. Git Bash) ovviamente. Utilizzare @ risposta di Mikel lì (delimitatore di default è scheda, semplicemente omettere -dargomento).
Ahmed Fasih,


4
@poige, che viene ksh93, no bash. Questo è supportato almeno da ksh93, zsh, bash, mksh e FreeBSD sh ( potrebbe passare alla prossima inversione principale delle specifiche standard POSIX persh ).
Stéphane Chazelas,


191

La scheda è l'impostazione predefinita.

Vedi la pagina man tagliata .

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

Quindi dovresti semplicemente scrivere

cut -f 2

2
Oops non ha notato quella linea.
Muhammad Hasan Khan,

4
Ma è probabilmente sempre più sicuro menzionare esplicitamente tali flag, sia per la leggibilità che per la portabilità. Posso immaginare che alcune persone che progettano un cutper Windows non seguano lo standard completo.
Willem Van Onsem,

3
Questa dovrebbe essere una risposta accettata: codice più semplice, spiegazione più semplice. lo
hai

5
Questa risposta mi ha cambiato la vita
matheeeny,

1
@WillemVanOnsem, se qualcuno scrive una versione di cutper Windows e non segue le specifiche POSIX , non c'è motivo di presumere che qualsiasi script POSIX funzionerà con quel sistema. Attenersi alle funzioni specificate da POSIX. Non cercare di consentire ipotetiche implementazioni future non conformi; non è questo che significa "portabilità".
Wildcard il

12
awk -F '\t' '{ print $2 }' inputfile

Questo estrae il secondo campo delimitato da tabulazioni di ciascuna riga di input da inputfile.


10

Più genericamente, senza richiedere caratteri invisibili: utilizzare trper convertire i delimitatori in un formato che può essere specificato più facilmente cut.

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

tr è uno strumento di sostituzione e sostituzione dei caratteri semplice ma potente.


1
E se l'input fosse abc(space)def(tab)ghi? La tua risposta produrrà def, ma dovrebbe cedere ghi. Allo stesso modo, se l'input è ABC(tab)DEF(space)GHI, la tua risposta produrrà DEF, ma dovrebbe cedere DEF(space)GHI.
G-Man,

@ G-Man: il delimitatore di spazio era solo un esempio. Usa qualsiasi delimitatore appropriato per i tuoi dati, ad esempio una virgola. echo -e "abc\tdef ghi" |tr '\t' ',' |cut -d',' -f2
nobar

... Ma sì, se il delimitatore deve essere una scheda, il mio approccio non funzionerà.
nobar
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.