Bagaimana saya bisa menggunakan kolom untuk membatasi pada tab dan bukan spasi?

59

Saya ingin menggunakan columnperintah Unix untuk memformat teks. Saya memiliki bidang yang dibatasi oleh tab, tetapi di dalam setiap bidang ada juga spasi. columnbatas pada spasi putih (tab dan spasi). Bagaimana saya bisa membuat kolom hanya menggunakan tab sebagai pembatas?

Saya mencoba menentukan tab sebagai pembatas menggunakan:

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

Jawaban:

82
column -t -s '\t'

akan memisahkan kolom \dan tkarakter.

column -s \tsama dengan column -s t, seperti garis miring terbalik ditafsirkan sebagai operator mengutip oleh shell.

Di sini Anda ingin meneruskan karakter TAB nyata ke kolom. Dengan ksh93, zsh, bash, mksh, busybox sh atau FreeBSD sh:

column -ts $'\t'

Atau masukkan karakter tab nyata dengan mengetik Ctrl-V Tabdi prompt shell (dalam tanda kutip atau diawali dengan garis miring terbalik karena karakter tab adalah pemisah token dalam sintaks shell seperti ruang), atau gunakan "$(printf '\t')"(tanda kutip ganda yang diperlukan untuk menonaktifkan split + glob operator sebagai karakter tab juga kebetulan berada dalam nilai default $IFS).

Stéphane Chazelas
sumber
3
Saya harus melakukan column -t -s $'\t'karena bash tampaknya berpikir '\t'berarti keduanya \ dan t, tetapi $'\t'berarti tab harfiah. Bash stinks
ThorSummoner
Jika Anda membutuhkan kepatuhan POSIX (tuan bantu saya), silakan lihat jawaban saya, yang sangat didasarkan pada jawaban yang fantastis ini!
Nick Bull
Solusi ini bekerja untuk saya - $'\t'pembatas make tab. Tapi saya cukup yakin saya lakukan awk -F "\t"untuk menggunakan tab sebagai pembatas untuk awk. Mengapa itu berfungsi dan tidak di sini untuk kolom?
Mike
3

Saya menggunakan yang berikut (hanya berfungsi jika teks Anda tidak mengandung |):

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

Ini hanya mengganti tab dengan pipa, kemudian menggunakan kolom dengan pipa sebagai pembatas.

(Saya melakukan ini karena saya tidak melihat apa pun dalam jawaban Stéphane yang bekerja di luar kotak di kulit ikan. Kalau tidak, jawaban Stéphane sepertinya baik.)

Aaron Feldman
sumber
3

Untuk POSIX, yang $'...'dikenal sebagai pelarian ANSI-C, tidak ditentukan.

Sebagai gantinya, Anda dapat menggunakan $(printf '\t'):

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

$(printf '\011')dapat digunakan, karena 011(representasi oktal dari desimal 9) adalah kode ANSI untuk karakter tab horizontal:

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

Namun lihat komentar di bawah ini dari Stéphane Chazelas mengapa hal ini mungkin tidak konsisten di seluruh versi shell.

Nick Bull
sumber
2
Perhatikan bahwa POSIX tidak menentukan apa pengkodean TAB. Masih ada sistem POSIX yang encoding lokal C berbasis EBCDIC di mana TAB 5, bukan 9 seperti di ASCII. Sedapat mungkin, lebih baik merujuk karakter dengan nama untuk menghindari masalah seperti ini "$(printf '\t')"seperti yang ditunjukkan dalam jawaban saya. Catatan yang $'...'direncanakan untuk dimasukkan dalam versi utama berikutnya dari spesifikasi POSIX.
Stéphane Chazelas
@ StéphaneChazelas adalah $(printf '\t')POSIX? Terima kasih!
Nick Bull
3
ya
Stéphane Chazelas
@ StéphaneChazelas Terima kasih banyak, saya telah memperbarui jawaban saya untuk memasukkan tip Anda yang sangat membantu :)
Nick Bull
2

The -tadalah untuk memilih jumlah kolom yang Anda inginkan. Membiarkan ini kosong tidak mengubah apa pun. Anda juga ingin ruang putih setelah -sjadi coba ini:

cat myfile | column -s \t

lurker
sumber
Terima kasih. Ini dekat dengan apa yang saya cari. Namun, sekarang semua garis digabung menjadi satu baris. Bagaimana saya bisa menjaga setiap baris di jalurnya sendiri?
kura
Secara default, columnmengisi baris sebelum kolom. Anda mungkin tertarik padapr
lurker