Bagaimana 2 file teks yang tidak diurutkan dengan panjang yang berbeda dapat ditampilkan berdampingan (dalam kolom) di ashell
Diberikan one.txt
dan two.txt
:
$ cat one.txt
apple
pear
longer line than the last two
last line
$ cat two.txt
The quick brown fox..
foo
bar
linux
skipped a line
Tampilan:
apple The quick brown fox..
pear foo
longer line than the last two bar
last line linux
skipped a line
paste one.txt two.txt
hampir melakukan trik tetapi tidak menyelaraskan kolom dengan baik karena hanya mencetak satu tab antara kolom 1 dan 2. Saya tahu bagaimana melakukannya dengan emacs dan vim tetapi ingin output ditampilkan ke stdout untuk perpipaan dll.
Solusi yang saya dapatkan dengan menggunakan sdiff
dan kemudian menyalurkan ke sed untuk menghapus sdiff
penambahan keluaran .
sdiff one.txt two.txt | sed -r 's/[<>|]//;s/(\t){3}//'
Saya dapat membuat fungsi dan menempelkannya di saya .bashrc
tetapi pasti perintah untuk ini sudah ada (atau solusi yang lebih bersih berpotensi)?
linux
shell
unix
command-line
gnu-coreutils
Chris Seymour
sumber
sumber
Jawaban:
Anda dapat menggunakan
pr
untuk melakukan ini, menggunakan-m
bendera untuk menggabungkan file, satu per kolom, dan-t
untuk menghilangkan header, misalnya.keluaran:
Lihat juga:
sumber
pr
sebelumnya. Saya mencoba dengan 3 file dan hasilnya terpotong tetapi-w
opsi menyelesaikannya. Jawaban bagus.$COLUMNS
, yang seharusnya disediakan oleh shell.pr
memotong ujung garis panjang. Apakah ada cara untuk membuatnya membungkus garis?Untuk sedikit memperluas jawaban @Hasturkun : secara default
pr
hanya menggunakan 72 kolom untuk keluarannya, tetapi relatif mudah untuk membuatnya menggunakan semua kolom yang tersedia di jendela terminal Anda:Sebagian besar shell akan menyimpan (dan memperbarui) layar lebar terminal Anda di
$COLUMNS
variabel lingkungan, jadi kami hanya meneruskan nilai itu kepr
untuk digunakan untuk pengaturan lebar keluarannya.Ini juga menjawab pertanyaan @Matt :
Jadi, no:
pr
sendiri tidak dapat mendeteksi lebar layar, tetapi kami membantu sedikit dengan mengirimkan lebar terminal melalui-w
opsi.sumber
Jika Anda tahu input file tidak memiliki tab, kemudian menggunakan
expand
menyederhanakan @oyss 's jawabannya :Jika mungkin ada tab di file masukan, Anda selalu dapat meluaskan terlebih dahulu:
sumber
Menggunakan
*
dalam spesifikasi format memungkinkan Anda menyediakan panjang bidang secara dinamis.sumber
diff -y one.txt two.txt
pekerjaan yang lebih baik daripadapaste one.txt two.txt
dan menghapus karakter tambahan diffs yang ditampilkan dengansed
sepele dibandingkan dengan menulis / mengingatawk
skrip. Bahkan dengan keduanya sebagai fungsi.bash_rc
lebih lama! = Lebih baik, lebih mudah dibaca, lebih cepat .. apa keuntungannya di sini?menghapus secara dinamis panjang bidang yang dihitung dari jawaban Barmar akan membuatnya menjadi perintah yang jauh lebih pendek .... tetapi Anda masih memerlukan setidaknya satu skrip untuk menyelesaikan pekerjaan yang tidak dapat dihindari apa pun metode yang Anda pilih.
sumber
Jika Anda ingin mengetahui perbedaan sebenarnya antara dua file secara berdampingan, gunakan
diff -y
:Anda juga dapat mengatur lebar keluaran menggunakan
-W, --width=NUM
opsi:dan untuk membuat
diff
keluaran kolom sesuai dengan jendela terminal Anda saat ini:sumber
Ada
sed
caranya:Dibawah pesta, Anda bisa menggunakan
printf -v
:(Tentu saja solusi @Hasturkun
pr
adalah yang paling akurat !) :Keuntungan
sed
lebihpr
Anda dapat memilih lebar pemisah dan atau pemisah dengan cermat:
Atau, sebagai contoh, untuk menandai garis yang mengandung
line
:akan membuat:
sumber
Temukan di bawah solusi berbasis python.
Contoh
sumber
sumber
sdiff
adalahdiff -y
yang saya bahas dalam pertanyaan.diff
menambahkan karakter di antara kedua file tersebut.