Saya punya dua file teks. Yang pertama memiliki konten:
Languages
Recursively enumerable
Regular
sedangkan yang kedua memiliki konten:
Minimal automaton
Turing machine
Finite
Saya ingin menggabungkan mereka menjadi satu kolom file-bijaksana. Jadi saya mencoba paste 1 2
dan hasilnya adalah:
Languages Minimal automaton
Recursively enumerable Turing machine
Regular Finite
Namun saya ingin memiliki kolom yang sejajar seperti
Languages Minimal automaton
Recursively enumerable Turing machine
Regular Finite
Saya bertanya-tanya apakah mungkin untuk mencapai itu tanpa penanganan secara manual?
Ditambahkan:
Berikut adalah contoh lain, di mana metode Bruce hampir menangkapnya, kecuali beberapa ketidaksejajaran tentang yang saya heran mengapa?
$ cat 1
Chomsky hierarchy
Type-0
—
$ cat 2
Grammars
Unrestricted
$ paste 1 2 | pr -t -e20
Chomsky hierarchy Grammars
Type-0 Unrestricted
— (no common name)
pr
danexpand
...columns
menghindari masalah ini.➀ unicode may render oddly
but the column count is ok
pasti tidak tidak berlaku untukwc-paste-pr
danwc-paste-pr
Mereka jangan tampilkan perbedaan jumlah kolom .. Yang lain ok.pr
multibyte karakter di lokal saat ini (biasanya UTF8).Jawaban:
Anda hanya perlu
column
perintah itu, dan katakan untuk menggunakan tab untuk memisahkan kolomUntuk mengatasi kontroversi "sel kosong", kita hanya perlu
-n
opsi untukcolumn
:Halaman manual kolom saya menunjukkan
-n
adalah "Debian GNU / Linux extension." Sistem Fedora saya tidak menunjukkan masalah sel kosong: tampaknya berasal dari BSD dan halaman manual mengatakan "Versi 2.23 mengubah opsi -s menjadi non-serakah"sumber
column
, tentu saja; betapa jelasnya (di belakang) +1 ... Terima kasih ...column -s $'\t' -t
mengabaikan sel - sel kosong , mengakibatkan semua sel berikutnya di sebelah kanannya (pada baris itu) bergerak ke kiri; yaitu, sebagai akibat dari baris kosong dalam file, atau lebih pendek ... :(Anda mencari
pr
perintah pesolek yang berguna :"-E24" adalah "memperluas tab berhenti ke 24 spasi". Untungnya,
paste
menempatkan karakter tab di antara kolom, sehinggapr
dapat memperluasnya. Saya memilih 24 dengan menghitung karakter dalam "Recursively enumerable" dan menambahkan 2.sumber
expand
perintah langsung:paste file1 file2 | expand -t 24
?sed
jadi ada satu proses yang tidak berjalan. Menggunakanpr
yang merupakan perintah kuno, dating ke hari Unix SysV, saya pikir, jadi mungkin ada pada lebih banyak instalasi daripadaexpand
. Singkatnya, itu hanya sekolah tua.Pembaruan : Ini dia skrip yang lebih sederhana (yang ada di akhir pertanyaan) untuk hasil tabulasi. Hanya lulus nama file untuk itu seperti yang Anda lakukan untuk
paste
... Menggunakanhtml
untuk membuat frame, sehingga sangat tweakable. Itu memang melestarikan banyak ruang, dan perataan kolom dipertahankan ketika bertemu karakter unicode. Namun, cara editor atau pemirsa merender unicode adalah masalah lain sepenuhnya ...---
Sinopsis alat yang disajikan dalam jawaban (sejauh ini).
Saya sudah cukup dekat melihat mereka; inilah yang saya temukan:
paste
# Alat ini umum untuk semua jawaban yang disajikan sejauh ini # Dapat menangani banyak file; karena itu banyak kolom ... Bagus! # Ini membatasi setiap kolom dengan Tab ... Bagus. # Outputnya tidak ditabulasi.Semua alat di bawah ini menghapus pembatas ini! ... Buruk jika Anda membutuhkan pembatas.
column
# Ini menghilangkan pembatas Tab, jadi pengidentifikasi bidang adalah murni oleh kolom yang tampaknya menangani dengan sangat baik .. Saya belum melihat sesuatu yang serba salah ... # Selain tidak memiliki pembatas yang unik, berfungsi dengan baik!expand
# Hanya memiliki pengaturan tab tunggal, sehingga tidak dapat diprediksi melebihi 2 kolom # Penjajaran kolom tidak akurat saat menangani unicode, dan menghapus pembatas Tab, jadi identifikasi bidang murni oleh perataan kolompr
# Hanya memiliki pengaturan satu tab, sehingga tidak dapat diprediksi melebihi 2 kolom. # Penjajaran kolom tidak akurat saat menangani unicode, dan menghapus pembatas Tab, jadi identifikasi bidang murni oleh perataan kolomBagi saya,
column
ini solusi terbaik yang jelas sebagai one-liner .. Anda ingin pembatas, atau tabluasi ASCII-art dari file Anda, baca terus, jika tidak ..columns
sangat bagus :) ...Berikut ini adalah skrip yang mengambil numper file apa pun dan membuat presentasi tabulasi ASCII-art .. (Ingatlah bahwa unicode mungkin tidak merender sesuai lebar yang diharapkan, mis. ௵ yang merupakan karakter tunggal. Ini sangat berbeda dengan kolom nomor menjadi salah, seperti halnya pada beberapa utilitas yang disebutkan di atas.) ... Keluaran skrip, yang ditunjukkan di bawah, berasal dari 4 file input, bernama F1 F2 F3 F4 ...
Inilah jawaban asli saya (dipangkas sedikit sebagai pengganti skrip di atas)
Menggunakan
wc
untuk mendapatkan lebar kolom, dansed
ke kanan pad dengan karakter yang terlihat.
(hanya untuk contoh ini) ... dan kemudianpaste
untuk bergabung dengan dua kolom dengan karakter Tab ...Jika Anda ingin mengisi kolom kanan:
sumber
Kamu hampir sampai.
paste
menempatkan karakter tab di antara setiap kolom, jadi yang perlu Anda lakukan adalah memperluas tab. (Saya menganggap file Anda tidak mengandung tab.) Anda perlu menentukan lebar kolom kiri. Dengan (cukup baru) utilitas GNU,wc -L
menunjukkan panjang garis terpanjang. Pada sistem lain, buat pass pertama dengan awk. Ini+1
adalah jumlah ruang kosong yang Anda inginkan di antara kolom.Jika Anda memiliki utilitas kolom BSD, Anda dapat menggunakannya untuk menentukan lebar kolom dan memperluas tab sekaligus. (
␉
adalah karakter tab literal; di bawah bash / ksh / zsh Anda dapat menggunakan$'\t'
sebagai gantinya, dan dalam shell apa pun yang dapat Anda gunakan"$(printf '\t')"
.)sumber
wc
, perintahnya harus:wc -L <left.txt
... karena, ketika nama file ditetapkan sebagai baris perintah arg , namanya adalah keluaran ke stdoutIni multi-langkah, jadi ini tidak optimal, tapi begini saja.
1) Temukan panjang garis terpanjang di
file1.txt
.Dengan contoh Anda, garis terpanjang adalah 22.
2) Gunakan awk untuk membalut
file1.txt
, melapisi setiap baris kurang dari 22 karakter hingga 22 denganprintf
pernyataan.Catatan: Untuk FS, gunakan string yang tidak ada di
file1.txt
.3) Gunakan tempel seperti yang Anda lakukan sebelumnya.
Jika ini adalah sesuatu yang sering Anda lakukan, ini dapat dengan mudah diubah menjadi skrip.
sumber
while IFS= read -r line
, jika tidak, shell akan memotong spasi dan backslash. Tetapi shell bukanlah alat terbaik untuk pekerjaan itu; versi terbaru dari coreutils GNU telahwc -L
(lihat jawaban fred), atau Anda dapat menggunakan awk:awk 'n<length {n=length} END {print +n}'
.Saya tidak dapat mengomentari jawaban glenn jackman, jadi saya menambahkan ini untuk mengatasi masalah sel kosong yang dicatat Peter.O. Menambahkan null char sebelum setiap tab menghilangkan proses pembatas yang diperlakukan sebagai satu break dan mengatasi masalah tersebut. (Saya awalnya menggunakan spasi, tetapi menggunakan null char menghilangkan ruang ekstra di antara kolom.)
Jika null char menyebabkan masalah karena berbagai alasan, cobalah:
atau
Keduanya
sed
dancolumn
tampaknya bervariasi dalam implementasi lintas rasa dan versi Unix / Linux, terutama BSD (dan Mac OS X) vs GNU / Linux.sumber
od -c
dan saya tidak melihat byte nol. Ini di centos dan ubuntu.\0
tidak berfungsi sebagainull
sed, tetapi\x0
berhasil. Namun, kemudian kolom memberiline too long
kesalahan. Hal paling sederhana tampaknya menggunakan ruang dan hidup dengan karakter ekstra.Membangun dari jawaban bahamat : ini bisa dilakukan sepenuhnya
awk
, membaca file hanya sekali dan tidak membuat file sementara. Untuk mengatasi masalah seperti yang dinyatakan, lakukanSeperti halnya banyak
awk
skrip sejenis ini, yang pertama di atas berbunyifile1
, menyimpan semua data dalamsave
array dan secara bersamaan menghitung panjang garis maksimum. Kemudian ia membacafile2
dan mencetak data yang disimpan (file1
) berdampingan dengan data saat ini (file2
). Akhirnya, jikafile1
lebih panjang darifile2
(memiliki lebih banyak baris), kami mencetak beberapa baris terakhirfile1
(yang tidak ada baris yang sesuai di kolom kedua).Mengenai
printf
format:"%-nns"
mencetak string yang dibenarkannn
lebar dalam karakter bidang ."%-*s", nn
melakukan hal yang sama -*
memberitahu untuk mengambil lebar bidang dari parameter berikutnya.maxlength+2
nn
+2
Script di atas hanya berfungsi untuk dua file. Itu sepele dapat dimodifikasi untuk menangani tiga file, atau untuk menangani empat file, dll., Tetapi ini akan membosankan dan dibiarkan sebagai latihan. Namun, ternyata tidak sulit untuk memodifikasi untuk menangani sejumlah dari file:
Ini sangat mirip dengan skrip pertama saya, kecuali
max_length
menjadi sebuah array.max_FNR
menjadi sebuah array.save
menjadi array dua dimensi.END
blok.sumber
paste
adalah solusi terbaik; secara khusus, glenn jackmanpaste file1 file2 | column -s $'\t' -t
. Tetapi saya pikir akan menyenangkan untuk mencoba memperbaikiawk
pendekatannya.