Saya memiliki dua file berikut (saya mengisi garis dengan titik-titik sehingga setiap baris dalam file memiliki lebar yang sama dan membuat file1 semua huruf besar agar lebih jelas).
contents of file1:
ETIAM......
SED........
MAECENAS...
DONEC......
SUSPENDISSE
contents of file2
Lorem....
Proin....
Nunc.....
Quisque..
Aenean...
Nam......
Vivamus..
Curabitur
Nullam...
Perhatikan bahwa file2 lebih panjang dari file1.
Ketika saya menjalankan perintah ini:
paste file1 file2
Saya mendapatkan hasil ini
ETIAM...... Lorem....
SED........ Proin....
MAECENAS... Nunc.....
DONEC...... Quisque..
SUSPENDISSE Aenean...
Nam......
Vivamus..
Curabitur
Nullam...
Apa yang bisa saya lakukan untuk output sebagai berikut?
ETIAM...... Lorem....
SED........ Proin....
MAECENAS... Nunc.....
DONEC...... Quisque..
SUSPENDISSE Aenean...
Nam......
Vivamus..
Curabitur
Nullam...
Saya mencoba
paste file1 file2 | column -t
tetapi ia melakukan ini:
ETIAM...... Lorem....
SED........ Proin....
MAECENAS... Nunc.....
DONEC...... Quisque..
SUSPENDISSE Aenean...
Nam......
Vivamus..
Curabitur
Nullam...
tidak sebagus output asli tetapi salah kolom bijaksana.
text-processing
columns
paste
Tulains Córdova
sumber
sumber
paste
menggunakan tab di depan baris dari file kedua. Anda mungkin harus menggunakan postprocessor untuk menyelaraskan kolom dengan tepat.paste file1 file2 | column -tn
?Jawaban:
Dengan asumsi Anda tidak memiliki karakter tab di file Anda,
dengan arg yang
-t
sesuai dipilih untuk menutupi lebar garis maks yang diinginkan dalam file1.OP telah menambahkan solusi yang lebih fleksibel:
Saya melakukan ini sehingga berfungsi tanpa angka ajaib 13:
Tidak mudah untuk mengetik tetapi bisa digunakan dalam skrip.
sumber
Saya pikir awk mungkin melakukannya dengan baik, jadi saya mencari "awk reading input dari dua file" di Google dan menemukan artikel tentang stackoverflow untuk digunakan sebagai titik awal.
Pertama adalah versi kental, kemudian berkomentar sepenuhnya di bawah itu. Ini membutuhkan waktu lebih dari beberapa menit untuk menyelesaikannya. Saya akan senang dengan beberapa perbaikan dari orang-orang pintar.
Dan di sini adalah versi yang sepenuhnya didokumentasikan di atas.
sumber
Bukan solusi yang sangat bagus tapi saya bisa melakukannya dengan menggunakan
di mana TAB diganti dengan karakter tab.
sumber
&&
dalam perintah sed?&
menempatkan apa yang sedang dicari (tab dalam kasus ini). Perintah ini hanya mengganti tab di awal dengan dua tab.TAB
untuk\t
membuat ini berfungsi di zsh di Ubuntu debian. Dan itu hanya berfungsi jika file1 memiliki kurang dari 15 karakterPada Debian dan turunannya,
column
memiliki opsi-n
nomerge yang memungkinkan kolom untuk melakukan hal yang benar dengan bidang kosong. Secara internal,column
menggunakanwcstok(wcs, delim, ptr)
fungsi, yang membagi string karakter lebar menjadi token dibatasi oleh karakter lebar dalamdelim
argumen.wcstok
dimulai dengan melewatkan karakter lebardelim
, sebelum mengenali token. The-n
pilihan menggunakan algorythm yang tidak melewatkan awal lebar-karakter dalamdelim
.Sayangnya, ini tidak terlalu portabel:
-n
spesifik untuk Debian, dancolumn
bukan di POSIX, ini sepertinya hal yang BSD.sumber
Mengambil titik-titik yang Anda gunakan untuk mengisi:
file1:
file2:
Coba ini:
Dan Anda akan mendapatkan:
sumber
paste
akan gagal untuk mencetak output yang tepat jika ada garis yang mengandung tab. +1 karena berbedaSebuah
awk
solusi yang harus cukup portabel, dan seharusnya bekerja untuk jumlah sewenang-wenang file masukan:sumber
paste-awk
dan mencobapaste file1 file2|paste-awk
dan saya mencobaawk paste-awk file1 file2
tetapi tidak ada yang berhasil.awk: Line:1: (FILENAME=file1 FNR=1) Fatal: Division by zero
awk -f paste-awk file1 file2
harus bekerja, setidaknya untuk awk dan mawk GNU.paste
ada sedikit ruang antara dua baris. Dan jika file input tidak memiliki semua baris dengan panjang yang sama, itu akan menghasilkan baris align-right-F\\t