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…