Memformat teks menjadi kolom

11

Saya memiliki file dengan dua kolom seperti yang ditunjukkan di bawah ini (contoh):

FILE 1:

John 1
Peter 2
Michael Rod 3
Su 7
Louise 9

Saya perlu memformat ini dan output yang saya harapkan adalah:

FILE 1:

John        1
Peter       2
Michael Rod 3
Su          7
Louise      9
Ram
sumber
1
dimana 2 kolomnya?
marc
Kedua output tampaknya sama. Bisakah Anda memberikan detail lebih lanjut tentang pertanyaan Anda?
2
Bagaimana kolom didefinisikan? Apakah ada tab atau karakter lain antara nama dan nomor? Bagaimana kita bisa tahu bahwa itu Michael Rod 3adalah 2 kolom dan bukan 3?
terdon
2
Tidak, jangan memposting gambar teks . Saya hanya akan menyalin dan menempelkan teks itu untuk dapat membantu Anda, dan sekarang saya tidak bisa.
Kusalananda
1
begitu pula dengan apa yang dikatakan mmmint dan terdon; dapatkah Anda menentukan, misalnya, bahwa itu adalah kolom terakhir yang perlu di-indentasi untuk memungkinkan lebar garis terpanjang?
Jeff Schaller

Jawaban:

18

Jika input hanya dua kolom, saya akan menyarankan untuk menggunakan column -t. Ini tidak cukup berfungsi di sini karena columnutilitas akan memperlakukan sejumlah spasi atau tab sebagai pembatas kolom:

$ column -t file1
John     1      
Peter    2      
Michael  Rod  3 
Su       7      
Louise   9      

"Michael Rod" adalah dua kolom, sehingga satu baris memiliki satu kolom lebih banyak daripada baris lainnya, yang mengacaukan output.

Kita dapat mengatasinya dengan menyisipkan karakter tab sebelum kolom terakhir dan kemudian columnmenggunakan (hanya) itu sebagai pembatas:

$ awk '{ $NF = "\t" $NF; print }' file1 | column -t -s $'\t'
John          1
Peter         2
Michael Rod   3
Su            7
Louise        9

Di Awk, NFadalah jumlah bidang (kolom), dan $NFmerupakan data di bidang terakhir. Skrip yang saya gunakan cukup memodifikasi data dari bidang terakhir dengan menambahkan karakter tab, sebelum mencetak baris lengkap.

Jika shell Anda tidak mengerti $'\t', maka Anda dapat memilih karakter lain yang bukan bagian dari data:

awk '{ $NF = "@" $NF; print }' file1 | column -t -s '@'
John          1
Peter         2
Michael Rod   3
Su            7
Louise        9
Kusalananda
sumber