Hapus baris berdasarkan duplikat dalam satu kolom tanpa mengurutkan

30

Saya memiliki file 3-kolom besar (~ 10.000 baris) dan saya ingin menghapus baris ketika isi kolom ketiga dari baris itu muncul di kolom ketiga dari baris lain. Ukuran file membuat agak rumit, dan saya tidak dapat menggunakan sesuatu seperti kode di bawah ini karena seluruh baris tidak identik; hanya isi kolom 3.

awk '!seen[$0]++' filename
Zach C
sumber

Jawaban:

31

Cukup ubah perintah awk Anda ke kolom yang ingin Anda lakukan untuk menghapus duplikat baris berdasarkan (dalam kolom kasus ketiga Anda):

awk '!seen[$3]++' filename

Perintah ini memberitahu awkbaris mana yang akan dicetak. Variabel $3memegang seluruh isi kolom 3 dan tanda kurung siku adalah akses array. Jadi, untuk setiap kolom ketiga baris dalam nama file, simpul array bernama seenbertambah dan garis dicetak jika konten dari node itu (kolom3) tidak ( !) sebelumnya ditetapkan.

awkPerintah di atas akan berfungsi jika kolom Anda di file input dibatasi dengan spaceatau di Tabantara mereka sendiri, jika kolom dibatasi dengan sesuatu yang lain, Anda perlu mengatakannya untuk memilih -Fopsi tersebut. Jadi, misalnya jika semua kolom dibatasi dengan koma ( ,) dan ingin menghapus garis berdasarkan -F','opsi penggunaan kolom ketiga .

awk -F',' '!seen[$3]++' filename
αғsнιη
sumber
18

sortperintah sudah dioptimalkan untuk menangani file besar. Jadi, Anda bisa menggunakan sortperintah pada file Anda sebagai,

sort -u -t' ' -k3,3 file
  • -u - hanya mencetak garis-garis unik.
  • -t- tentukan pembatas. Di sini, dalam contoh ini, saya hanya menggunakan spasi sebagai pembatas.
  • -k3,3 - urutkan pada bidang ke-3.

Anda bisa merujuk ke jawaban ini yang menunjukkan bahwa GNU sort sebenarnya adalah pendekatan yang lebih baik untuk mengurutkan file besar. Dalam kasus Anda, saya pikir bahkan tanpa -parallel, Anda dapat mencapai hasil akhir Anda tanpa banyak penundaan waktu.

Ramesh
sumber
Akan berkomentar snarkily yang -uhanya akan menghapus garis duplikat , bukan kunci duplikat ... tapi aku salah.
Randoms
@ Ramesh itu melakukan pekerjaan tetapi penyortiran mengubah urutan garis yang saya kira tidak selalu diharapkan.
Bharat