Saya punya beberapa file teks baris (kadang-kadang) data dibatasi-tab. Saya ingin menampilkan file sehingga saya dapat meliriknya - jadi saya hanya ingin melihat 80 karakter pertama dari setiap baris (saya merancang file teks untuk menempatkan hal-hal penting terlebih dahulu di setiap baris).
Saya pikir saya bisa menggunakan cat untuk membaca setiap baris file, dan mengirim setiap baris ke perintah berikutnya dalam sebuah pipa:
cat tabfile | cut -c -80
Tapi itu sepertinya rusak. Saya mencoba bermain-main, dan grep tampaknya bekerja - tetapi kemudian saya menemukan bahwa, tidak, tidak (tidak setiap baris dalam file memiliki 80+ karakter) - tampaknya tab dihitung sebagai karakter tunggal dengan dipotong.
Saya mencoba:
cat tabfile | tr \t \040 | cut -c -80
Meskipun itu akan sedikit mengacaukan data saya, dengan menghilangkan keterbacaan ruang putih. Tapi itu tidak berhasil. Tidak juga:
cat tabfile | tr \011 \040 | cut -c -80
Mungkin saya menggunakan tr salah? Saya pernah mengalami masalah dengan tr sebelumnya, ingin menghapus beberapa spasi (muncul versi tr yang saya akses di mesin ini memiliki opsi -s untuk memeras beberapa karakter - saya mungkin perlu lebih banyak bermain dengan itu)
Saya yakin jika saya bermain-main saya bisa menggunakan perl, awk atau sed, atau sesuatu untuk melakukan ini.
Namun, saya ingin solusi yang menggunakan perintah biasa (POSIX?), Sehingga se portable mungkin. Jika saya akhirnya menggunakan tr, saya mungkin akhirnya akan mencoba mengubah tab menjadi karakter, mungkin melakukan perhitungan, memotong perhitungan, dan kemudian mengubah karakter tersebut kembali menjadi tab untuk output.
Tidak perlu satu baris / dimasukkan langsung pada baris perintah - skrip baik-baik saja.
Info lebih lanjut tentang file-tab:
Saya menggunakan tab untuk memecah bidang, karena suatu hari nanti saya mungkin ingin mengimpor data ke beberapa program lain. Jadi saya cenderung hanya memiliki satu tab di antara potongan konten. Tapi saya juga menggunakan tab untuk menyelaraskan hal-hal dengan kolom vertikal, untuk membantu keterbacaan saat melihat file teks biasa. Yang berarti untuk beberapa bagian teks, saya mengisi bagian akhir konten dengan spasi hingga saya sampai di tempat tab akan bekerja dalam menyejajarkan bidang berikutnya dengan yang di atas dan di bawahnya.
DarkTurquoise # 00CED1 Lautan, Langit, Alam Perahu Dayung MediumSpringGreen # 00FA9A Berguna untuk Pohon Ajaib Lime # 00FF00 Hanya untuk digunakan pada ayam spring dan fru $
sumber
pr
daricoreutils
:pr -1 -t -l200 -W80 file
. Menambah / mengurangi panjang halaman (nomor setelah-l
) sesuai kebutuhan Anda.Jawaban:
Saya pikir Anda sedang mencari
expand
dan / atauunexpand
. Tampaknya Anda mencoba untuk memastikan\t
lebar ab dihitung sebagai 8 karakter daripada yang tunggal.fold
akan melakukannya juga, tetapi akan membungkus inputnya ke baris berikutnya daripada memotongnya. Saya pikir Anda ingin:expand
danunexpand
keduanya ditentukan POSIX :expand
utilitas akan menulis file atau standar input ke output standar dengan\t
karakter ab diganti dengan satu atau lebih ruang karakter yang dibutuhkan untuk pad ke tab perhentian berikutnya. Setiap karakter backspace harus disalin ke output dan menyebabkan jumlah posisi kolom untuk penghentian tab-tab dikurangi; hitungan posisi kolom tidak akan dikurangi di bawah nol.Cukup mudah. Jadi, inilah yang dilihatnya:
The
until
Loop di atas mendapat satu set data seperti ...Ini
printf
adalah ini dengan%*s
flag padding arg sehingga untuk masing-masing orang di setprintf
akan pad dengan ruang sebanyak dalam jumlah argumen. Untuk masing-masing menambahkan\t
karakter ab.Semua
tee
s digunakan untuk menunjukkan efek dari setiap filter saat diterapkan.Dan efeknya adalah ini:
Baris-baris itu berbaris dalam dua set seperti ...
printf ...; echo
tr ...
atauexpand
cut
wc
Empat baris teratas adalah hasil dari
tr
filter - di mana setiap\t
ab dikonversi ke ruang tunggal .Dan empat terbawah adalah hasil dari
expand
rantai.sumber
Karena tab lebih untuk penyejajaran daripada pembatasan, salah satu caranya adalah menggunakan
column
dan kemudiancut
:Tampaknya
column
bukan POSIX. Ini adalah bagian dari utils BSD di Ubuntu, jadi saya menganggap itu adalah cross platform.sumber
column
cara ini OP bahkan tidak perlu menambahkan spasi secara manual untuk menyelaraskan.Saran Don dalam komentar adalah awal yang baik.
Inilah yang saya butuhkan untuk membuatnya (kebanyakan) bekerja:
Itu
-m
diperlukan untuk membuat-w
bendera berlaku pada satu kolom. Halaman manual dapat menggunakan beberapa penulisan ulang untuk menunjukkan hal itu.Ketika mencoba solusinya, saya menemukan bahwa
pr
menampilkan\t
karakter, jadi memberi makan hasilnyacut
menghasilkan masalah yang sama.-1
(bendera kolom) secara khusus mengatakan di halaman manual:Namun, tanpa opsi ini
pr
memotong garis mau tak mau, jauh lebih pendek dari panjang yang ditentukan.pr
juga menyisipkan spasi sebelum (atau sesudah?) setiap kata dalam bidang (yaitu setiap tempat saya memiliki satu ruang, memiliki dua setelah pemrosesan). Jika ada terlalu banyak kata, spasi yang dimasukkan mengabaikan-w
batasan (membuat wrap-around). Tapi, anehnya, 'kolom' dibatasi-non-tab-dibatasi (yaitu spasi putih) tetap berbaris.sumber
Menggunakan
awk
:Berdasarkan jawaban Chris Down di sini .
sumber
Satu utilitas yang harus benar-benar disadari oleh lebar layar adalah
fold
: sayangnya, sepertinya tidak memiliki opsi untuk membuang alih-alih membungkus. Meskipun mungkin sangat tidak efisien, namun Anda dapat melakukan sesuatu sepertisumber