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…