Saya memiliki file dengan satu kolom dengan nama yang berulang beberapa kali. Saya ingin menyingkat setiap pengulangan menjadi satu, sambil menjaga pengulangan lainnya dengan nama yang sama yang tidak berdekatan dengan pengulangan lainnya dengan nama yang sama.
Misalnya saya ingin mengubah sisi kiri ke sisi kanan:
Golgb1 Golgb1
Golgb1 Akna
Golgb1 Spata20
Golgb1 Golgb1
Golgb1 Akna
Akna
Akna
Akna
Spata20
Spata20
Spata20
Golgb1
Golgb1
Golgb1
Akna
Akna
Akna
Inilah yang telah saya gunakan: perl -ne 'print if ++$k{$_}==1' file.txt > file2.txt
Namun, metode ini hanya membuat satu perwakilan dari kiri (yaitu Golb1 dan Akna tidak diulang).
Apakah ada cara untuk menyimpan nama-nama unik untuk setiap blok, sambil menjaga nama-nama yang berulang dalam beberapa blok yang tidak berdekatan?
sort | uniq
sort -u
(:Awk
larutan:Hasil:
sumber
Coba ini - simpan baris sebelumnya dan bandingkan dengan baris saat ini
Anda telah menandai
uniq
juga - apakah Anda mencobanya?sumber
Dengan sed itu bisa dilakukan sebagai berikut:
Di sini kita miliki di ruang pola setiap saat 2 baris. Ketika perbandingan di antara mereka gagal, kami mencetak yang pertama dan memotongnya dari depan dan kembali dan menambahkan baris berikutnya ke dalam ruang pola. Bilas ... ulangi
Memanfaatkan Perl dalam mode slurp kami memperlakukan seluruh file sebagai satu string panjang di mana regex diterapkan yang melakukan perbandingan untuk Anda.
sumber
Pertanyaan tentang solusi sed Rakesh Sharma.
Bagaimana jika Anda memiliki file input seperti:
Dan Anda ingin file output menjadi:
Perhatikan yang hilang:
Saya tahu perintah yang saya inginkan mirip dengan solusi Anda:
Tidak dapat mengubahnya dengan cara yang benar untuk mencetak kedua kolom dan hanya diurutkan dengan cara khusus ini dengan nilai kolom 2. Ada tips?
sumber
sed -e '$!N' -e '/.*\.\([0-9]*\)\n.*\.\1$/!{P;D;}' -e 's/\n.*//;s/^/\n/;D'
akan menghapus elemen berulang berikutnya. Catatan: Ini membutuhkanGNU sed
. UntukPOSIX
perilaku, perlu sedikit perubahan.