Saya punya file f1.txt
,:
ID Name
1 a
2 b
3 g
6 f
Jumlah ruang tidak tetap. Apa cara terbaik untuk mengganti semua ruang putih dengan hanya menggunakan satu ruang tr
?
Inilah yang saya miliki sejauh ini:
cat f1.txt | tr -d " "
Tetapi hasilnya adalah:
IDName
1a
2b
3g
6f
Tapi saya ingin terlihat seperti ini:
ID Name
1 a
2 b
3 g
6 f
Silakan coba dan hindari sed
.
sed
. Ingin tahu cara lainJawaban:
Dengan
tr
, gunakan opsi pengulangans
queeze :Atau Anda dapat menggunakan
awk
solusi:Saat Anda mengubah bidang dalam rekaman,
awk
membangun kembali$0
, mengambil semua bidang dan menyatukannya, dipisahkan olehOFS
, yang merupakan ruang secara default.Itu akan memeras urutan spasi dan tab (dan mungkin karakter kosong lainnya tergantung pada lokal dan implementasi
awk
) menjadi satu ruang, tetapi juga menghapus blanko terkemuka dan tertinggal dari setiap baris.sumber
awk
, dia bisa melakukan apa saja. Anda juga dapat menerima solusinya. Hanya satu hal: Gnouc dapatkah Anda menjelaskan apa format awk dalam perintah Anda? Dapatkah Anda menambahkan tab / spasi sehingga hasilnya sesuai dengan hasil yang diharapkan dari Unknown?column -t
halnya. Tambahkan penjelasan untukawk
.tr
akan mengganti dua spasi di ujung garis dengan satu spasi.awk
akan menghapus semua spasi tambahan.Cukup gunakan
column
:Keluaran:
sumber
column -t f1.txt | cut -d " " -f2
Tapi itu bukan solusi yang saya harapkancolumn -t file | awk '{print $2}'
mencetak kolom kedua sajaJika Anda ingin memeras "spasi putih" Anda akan ingin menggunakan set karakter yang telah ditentukan sebelumnya tr:: blank: "(tab dan spasi spasi putih horisontal) atau": spasi: "(spasi putih verical):
Contoh dijalankan pada Red Hat 5 (GNU tr).
Dalam kasus saya, saya ingin menormalkan semua spasi putih menjadi satu ruang sehingga saya bisa mengandalkan ruang sebagai delmitter.
Seperti yang ditunjukkan oleh komentar kedua dastrobu, saya melewatkan kata-kata di halaman manual:
Ini memungkinkan kita untuk menghilangkan tr pertama. Kudo untuk bersabar atas kesabarannya di hadapan kepadatanku.
Sebelumnya, parsing port dari Redis config. mengajukan:
Setelah, dengan SET2 ditentukan dengan pemerasan:
Keluaran:
Untuk lebih jelasnya mencakup nuansa whitespace
Tunjukkan di mana squeeze saja gagal ketika karakter campuran berturut-turut yang termasuk dalam kelas karakter [: blank:] terlibat:
Catatan: Dua bidang string saya dalam format printf dipisahkan oleh 1 spasi, 1 tab, 1 spasi. Setelah ditekan urutan ini masih ada. Dalam output dump Octal ini diwakili oleh urutan ascii 040 011 040.
sumber
tr "[:blank:]" " " | tr -s "[:blank:]"
? Saya kira bagian pertama sudah cukup, yaitutr "[:blank:]" " "
karena itu menormalkan spasi dan sudah melakukan substitusi. Dari halaman manual: "Peras beberapa kejadian karakter [...] Ini terjadi setelah semua penghapusan dan terjemahan selesai."printf 'ID \t Name\n' | tr -s "[:blank:]" " " | od -cb
(seperti yang disarankan oleh @dastrobu) dan saya mendapatID Name\n
(dengan satu spasi) sebagai keluaran. Apakah Anda benar-benar mencobanya, @ user3183018?printf 'ID␣\t␣Name\n' | tr -s "[:blank:]" "␣"
(seperti yang disarankan oleh @dastrobu), di mana␣
merupakan spasi, dan saya mendapatID␣Name\n
(dengan satu spasi) sebagai output. Ini persis sama dengan contoh Anda tentang "Port <SPACE> <TAB> <SPACE> 6379" kecuali saya menggunakan string heading dari pertanyaan. Saya ingin tahu apakah Anda mencobatr -s "[:blank:]"
(tanpa"␣"
argumen terakhir ).printf 'ID \t Name\n' | od -cb
, itu menunjukkan apa yang seharusnya:I
D
\t
N
a
m
e
\n
(yaitu,I
D
040
011
040
N
a
m
e
\n
). Sementara itu, dengan bukti Anda sendiri, Anda membuat kesalahan yang saya duga adalah: Anda menjalankantr -s "[:blank:]"
(yaitu,tr
dengan satu opsi dan satu argumen), alih-alih perintah yang @dastrobu dan saya presentasikan empat kali sekarang:tr -s '[:blank:]' '␣'
(Yaitu,tr
dengan satu opsi dan dua argumen ).Siapa yang butuh program (selain shell)?
Jika Anda ingin nilai di kolom kedua berbaris, seperti dalam
column
jawaban polym , gunakanprintf
sebagai gantiecho
:sumber
tr
seruan yang kecil - yang belum lagi berapa banyak pekerjaan yang diperlukan untuk menulis. Terakhir, bukankah Anda akan mengatakan bahwa posting ini tidak benar-benar menjawab pertanyaan sebagaimana ditanyakan? Apa cara terbaik untuk mengganti semua ruang putih dengan satu ruang hanya menggunakan tr?$IFS
? Mungkin seperti:IFS=' <tab>' set -f ; echo $(cat <file)
?Ini adalah pertanyaan lama dan dipecahkan berkali-kali. Hanya untuk kelengkapan: Saya punya masalah serupa, tetapi ingin melewati jalur melalui pipa ke program lain. Saya menggunakan xargs .
jadi
cat f1.txt | xargs -L1
sepertinya output persis apa yang Anda inginkan.sumber