GNU/Linux >> Belajar Linux >  >> Linux

Hapus Baris Berturut-turut Dalam Csv Dengan Nilai Duplikat Dalam Satu Bidang, Tapi Pertahankan Baris Terakhir?

Saya memiliki file CSV panjang dengan dua kolom, termasuk menjalankan duplikat berurutan seperti ini:

...
1500,1533
1554,1678
1554,1703
1554,1728
1593,1766
...

Saya perlu menghapus semua duplikat ini kecuali yang terakhir – jadi output untuk contoh di atas adalah:

...
1500,1533
1554,1728
1593,1766
...

Saya juga perlu menyimpan sisa baris dalam file dalam urutan aslinya.

Saya mencoba tac file.csv | sort -k1,1 -r -u -t,

tapi ini tidak memberikan hasil yang diinginkan, dan fungsi berbasis sort mengacaukan urutan baris saya.

Jawaban yang Diterima:

Dengan sed :

sed '$!N;/\(.*,\).*\n\1/!P;D' infile

N berarti selalu ada dua baris berurutan dalam ruang pola dan sed P mencetak yang pertama hanya jika bidang pertama di baris itu tidak sama dengan bidang pertama di baris kedua. Kemudian D menghapus baris pertama dari ruang pola dan memulai kembali siklus.

Cara lain dengan gnu datamash (dengan asumsi file Anda diurutkan sebagai datamash membutuhkan input yang diurutkan):

datamash -t ',' -g 1 last 2 <infile

g . ini menggabungkan , masukan dibatasi oleh 1 bidang st, hanya mencetak last nilai (dari 2 nd kolom) dari setiap grup.

Jika file Anda tidak diurutkan datamash dapat mengurutkannya melalui -s :

datamash -t ',' -s -g 1 last 2 <infile

tapi itu berarti urutan awal baris tidak akan dipertahankan. Jadi ini mungkin tidak melakukan apa yang Anda inginkan. Dalam hal ini Anda dapat menggunakan sed /awk /perl dll…


Linux
  1. Looping Melalui File Dengan Spasi Dalam Nama??

  2. Alat Untuk Mendapatkan Garis Dalam Satu File Yang Tidak Di File Lain?

  3. Sisipkan Baris Baru Dengan Nilai yang Hilang (na)?

  1. Hapus File Log Lama Kecuali Yang Terakhir (Diurutkan Secara Alfanumerik)?

  2. Urutkan Tapi Pertahankan Baris Header Di Atas?

  3. Temukan Usia File Tertua Dalam Satu Baris Atau Kembalikan Nol?

  1. Hapus lima karakter pertama pada baris mana pun dari file teks di Linux dengan sed

  2. Linux - grep dari baris tertentu ke akhir file

  3. ganti baris dalam satu file dengan baris lain dengan nomor baris