Saya memiliki file berikut:
AA,true
AA,false
BB,false
CC,false
BB,true
DD,true
Saya mencoba mencari duplikat dan menghapus baris yang memiliki nilai kolom sama dengan true
.
sebagai output seharusnya:
AA,false
BB,false
CC,false
DD,true
text-processing
awk
sed
Hani Gotc
sumber
sumber
true
jika itu contoh pertama dari kolom pertama?AA,true AA,false AA,false AA,false
Output apa yang harus dalam kasus ini? Saya mengerti, baris itu harus dihapus hanya jika memiliki duplikat dan mengandungtrue
pada saat yang sama. Semuafalse
baris harus tetap tidak tersentuh dalam hal apa pun. Artinya, dalam hal ini, hanyaAA, true
akan dihapus. Tetapi semua jawaban hanya menyisakan satu baris -AA,false
. Cukup menarik :)Jawaban:
Untuk memperluas skrip secara vertikal untuk penjelasan:
sumber
Versi sederhana:
"false" mengurutkan secara alfabet sebelum "true," dan perintah Awk di sini hanya membuat baris pertama hanya untuk setiap nilai bidang pertama yang berbeda.
Jika Anda ingin tetap "benar", bukan "salah," balikkan urutkan, berikan ke perintah Awk yang sama, dan balikkan urutkan lagi sesudahnya.
sumber
-u
opsi tersedia,sort input.txt | sort -t, -u -k1,1
sort
panggilan? Kenapa tidak adilsort -ut, -k1,1 input.txt
?-u
akan mempertahankan baris pertama yang ditemukan dari file input di antara duplikat ... untuk kasus yang diberikan, input harus disortir sebelum-u
dapat diterapkan ... misalnya:AA,true
akan dicetak alih-alihAA,false
karena muncul pertama kali dalam sampel yang diberikan .. alasan yang sama mengapaawk -F, '!a[$1]++'
sendirian tidak akan menyelesaikan masalah iniStruktur data:
%h
yang kuncinya adalah bidang pertama (AAA, BBB, CCC, dll.) Dan nilai yang sesuai adalah angka yang memberi tahu urutan kemunculan kunci tersebut. Jadi, misalnya, kunci AAA => 0, kunci BBB => 1, kunci CCC => 2.@h
yang elemen-elemennya adalah garis-garis yang terdapat dalam urutan pencetakan. Jadi jika benar dan salah ditemukan dalam data, maka nilai palsu akan masuk ke array. OTW, jika ada satu jenis data, maka itu akan hadir.Cara lain menggunakan sed GNU:
FWIW, kode setara POSIX untuk kode sed GNU di atas tercantum di bawah ini:
Penjelasan
Hasil
sumber
Untuk setiap baris input, simpan nilai bidang kedua dalam array asosiatif
a
(menggunakan bidang pertama sebagai kunci array) HANYA jika kami belum menyimpan nilaifalse
untuk kunci tersebut. Gunakan,
untuk pemisah bidang input dan output. Cetak array setelah kita membaca semua jalur input.Perbedaan signifikan antara ini dan versi DopeGhoti adalah bahwa versi ini tidak peduli sama sekali tentang nilai
$2
, hanya peduli tentang nilai, jika ada, daria[$1]
.sumber
sort
Solusi dua jalursort
Catatan kelompok pertama lulus oleh lapangan1
denganfalse
catatan sebelumnyatrue
untuk setiap blok catatan berbagi1
nilai bidang umum . Keduasort
lulus diatur untuk menghasilkan satu catatan untuk setiap nilai yang berbeda dalam bidang1
sopan santun-u
. Karena-u
menyiratkan jenis yang stabil, maka satu catatan yang dihasilkan adalah rekaman pertama yang ditemukan untuk setiap nilai berbeda dalam bidang1
- yang merupakan catatan denganfalse
di bidang kedua karena pekerjaan yang dilakukan olehsort
lintasan pertamasumber