Come posso usare la colonna per delimitare le schede e non gli spazi?


59

Vorrei usare il columncomando Unix per formattare del testo. Ho campi delimitati da tabulazioni, ma all'interno di ogni campo ci sono anche spazi. columndelimita su spazi bianchi (schede e spazi). Come posso fare in modo che le colonne utilizzino solo le schede come delimitatore?

Stavo cercando di specificare la scheda come delimitatore utilizzando:

cat myfile | column -t -s"\t"

Risposte:


82
column -t -s '\t'

separerebbe colonne \e tcaratteri.

column -s \tè uguale a column -s t, poiché la barra rovesciata viene interpretata come un operatore di quotazione dalla shell.

Qui vuoi passare un carattere TAB reale alla colonna. Con ksh93, zsh, bash, mksh, busybox sh o FreeBSD sh:

column -ts $'\t'

Oppure inserisci un carattere di tabulazione reale digitando Ctrl-V Tabal prompt della shell (tra virgolette o preceduto da una barra rovesciata poiché il carattere di tabulazione è un separatore di token nella sintassi della shell proprio come lo spazio), oppure usa "$(printf '\t')"(quelle doppie virgolette necessarie per disabilitare la divisione + glob l'operatore come il carattere di tabulazione si trova anche nel valore predefinito di $IFS).


3
Ho dovuto fare column -t -s $'\t'come bash sembrava pensare '\t'entrambi \ e t, ma $'\t'significa una scheda letterale. Bash puzza
ThorSummoner il

Se hai bisogno della conformità POSIX (Signore, aiutami), vedi la mia risposta, che è fortemente basata su questa fantastica risposta!
Nick Bull,

Questa soluzione ha funzionato per me: la $'\t'scheda rende il delimitatore. Ma sono abbastanza sicuro awk -F "\t"di usare una scheda come delimitatore per awk. Perché funziona e non qui per la colonna?
Mike,

3

Ho usato il seguente (funziona solo se il testo non contiene |):

cat myfile | tr '\t' '|' | column -t -s '|'

Questo sostituisce semplicemente le schede con pipe, quindi usa la colonna con pipe come delimitatori.

(L'ho fatto perché non ho visto nulla nella risposta di Stéphane che ha funzionato all'improvviso nella conchiglia. Altrimenti, la risposta di Stéphane sembra buona.)


3

Per POSIX, $'...'noto come escape ANSI-C, non è definito.

Invece, puoi usare $(printf '\t'):

column -t -s "$(printf '\t')"

$(printf '\011')può essere utilizzato, poiché 011(rappresentazione ottale del decimale 9) è il codice ANSI per un carattere di tabulazione orizzontale:

column -t -s "$(printf '\011')"

Tuttavia, vedi i commenti seguenti di Stéphane Chazelas sul perché questo potrebbe non essere coerente tra le versioni di shell.


2
Si noti che POSIX non specifica quale sia la codifica di TAB. Esistono ancora sistemi POSIX la cui codifica locale C è basata su EBCDIC in cui TAB è 5, non 9 come in ASCII. Ove possibile, è meglio fare riferimento ai caratteri per nome per evitare questo tipo di problema, come "$(printf '\t')"mostrato nella mia risposta. Si noti che $'...'è previsto l'inclusione nella prossima versione principale della specifica POSIX.
Stéphane Chazelas,

@ StéphaneChazelas è $(printf '\t')POSIX? Grazie!
Nick Bull,


@ StéphaneChazelas Grazie mille, ho aggiornato la mia risposta per includere il tuo suggerimento molto utile :)
Nick Bull

2

Il -tè per la selezione del numero di colonne che si desidera. Lasciare questo spazio vuoto non cambia nulla. Inoltre, dopo lo spazio desiderato si desidera uno spazio bianco -s:

cat myfile | column -s \t


Grazie. Questo è vicino a quello che sto cercando. Tuttavia, ora tutte le linee vengono unite su una riga. Come posso mantenere ogni riga sulla propria riga?
tartaruga,

Per impostazione predefinita, columnriempie le righe prima delle colonne. Potresti essere interessato apr
lurker
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.