Saya sedang mengedit tabel sederhana. Saya ingin diformat dengan baik. Sementara saya bisa menggunakan tbl
,, latex
atau serupa, ini tampaknya berlebihan - teks biasa benar-benar cukup. Karena sederhana, saya mungkin juga memiliki sumber menjadi output. Jadi sumbernya juga harus terlihat bagus. Ini sepertinya merupakan pekerjaan yang sempurna untuk column -s '|' -t
- ia menemukan separator dan secara otomatis memasukkan spasi untuk menyelaraskan sesuai dengan lebar maksimum di setiap kolom. Sayangnya, ini menghapus pemisah, jadi saya tidak bisa memutarnya lagi setelah diedit lebih lanjut. Apakah ada alat pemrosesan teks yang bagus yang dapat melakukan ini dengan idempoten, sehingga hasilnya berfungsi sebagai input? Atau apakah saya perlu menulis sendiri?
EDIT: inilah contoh yang saya inginkan:
foo | bar | baz
abc def | 12 | 23456
harus menjadi
foo | bar | baz
abc def | 12 | 3456
Kapan ' '
pemisah dan pengatur jarak, column -t
bekerja dengan baik. Tapi item saya memiliki ruang di dalamnya, jadi saya tidak bisa menggunakannya. Memiliki spacer berbeda dari separator menyulitkan banyak hal. Saya pikir itu berguna untuk mereka diperlakukan sebagai karakter pemisah ketika di sebelah pemisah, tapi bukan itu yang column -s '|' -t
terjadi (meskipun jelas perilaku saat ini juga berguna).
sumber
printf
holocaust setiap kali, yang telah saya temukan sejauh ini, adalah menambahkan karakter unik (seperti@
) ke dalam data, dan menggunakannya... | column -s@ -t
setelahnya.Jawaban:
Tidak yakin apakah saya mengerti benar apa masalah Anda. Tetapi, dapatkah itu diselesaikan dengan menambahkan pemisah temporal tambahan? karenanya Anda dapat menggunakan pemisah kedua untuk menandai pemisahan, menjaga pemisah asli tidak tersentuh.
Lihat contoh ini di mana saya menambahkan "@" ke masing-masing "|" jadi input dari perintah kolom adalah "xxx @ | yyyy". Kolom akan memproses "@" menjaga "|" tak tersentuh:
sumber
sed 's/ *| */@| /g'
sajased 's/ |/|/g'
setelahcolumn
perbaikan, ruang ekstra ditambahkan. Kami sekarang memiliki solusi yang cukup baik untuk saya. (Meskipun akan lebih baik jika tidak bergantung pada karakter tambahan seperti ini. Bagaimana jika seseorang tidak tersedia?)Ini tidak tersedia ketika Anda mengajukan pertanyaan tetapi pada v. 2.23
column
dariutil-linux
memungkinkan Anda untuk memilih pemisah output melaluiJadi cukup jalankan:
sumber
util-linux
versi ini tidak tersedia di Ubuntu 18.04 (dan mungkin distro lain yang berasal dari Debain) pada saat penulisan. Hanyabsdmainutils
versi yang tersedia. Thebsdmainutils
Versi tidak mendukung format output.Ini skrip bash. Itu tidak menggunakan 'kolom -t`, dan pemisah ditangani persis seperti IFS, karena itu adalah IFS (atau setidaknya, versi internal awk dari IFS) ... Pembatas default adalah $' \ t '
Script ini sepenuhnya mencentang bidang paling kanan.
'kolom' tidak melakukan ini.
Dengan mengisi semua kolom, skrip ini dapat
dengan mudah dimodifikasi untuk membuat bingkai tabel juga.
Catatan. File input perlu diproses dua kali
('kolom' juga perlu melakukan ini)
Lulus pertama adalah untuk mendapatkan lebar maks kolom.
Lulus kedua adalah untuk memperluas bidang (per kolom)
Menambahkan beberapa opsi dan memperbaiki bug mencolok (mengganti nama variabel :(
sumber
Lihatlah plugin vim yang disebut Tabularize
sumber
Ini adalah tweak dua-pass pada jawaban hmontoliu , yang menghindari perlunya pembatas kode yang sulit, dengan menebaknya dari data input.
$d
.@
, sesuai dengan komentar PeterO .Kode adalah fungsi yang menerima nama file, atau masukan dari STDIN :
Output dari
algn foo
(atau jugaalgn < foo
):sumber
Ide hmontoliu yang digunakan untuk mengimplementasikan perintah sederhana:
Komentar:
${1:-,}
- adalah argumen pertama dengan,
sebagai defaultsed
menyisipkan simbol perantara ($interm
argumen 2 atau~
secara default)column
ganti simbol perantara dengan spasi yang melakukan perataansed
membersihkan ruang redundan setelahcolumn
perintahContoh penggunaan:
Ini juga bagus karena idempoten: Anda dapat menerapkannya beberapa kali dan mendapatkan hasil yang sama (misalnya ketika Anda mengedit dalam vim dan meluruskan kembali).
sumber