Saya memiliki referensi saya sebagai file teks dengan daftar panjang entri dan masing-masing memiliki dua (atau lebih) bidang.
Kolom pertama adalah url referensi; kolom kedua adalah judul yang mungkin sedikit berbeda tergantung bagaimana entri dibuat. Sama untuk bidang ketiga yang mungkin ada atau tidak ada.
Saya ingin mengidentifikasi tetapi tidak menghapus entri yang memiliki bidang pertama (url referensi) yang identik. Saya tahu tentang sort -k1,1 -u
tetapi itu akan secara otomatis (non-interaktif) menghapus semua kecuali hit pertama. Apakah ada cara untuk memberi tahu saya agar saya dapat memilih mana yang akan dipertahankan?
Dalam ekstrak di bawah tiga baris yang memiliki bidang pertama yang sama ( http://unix.stackexchange.com/questions/49569/
), saya ingin menyimpan baris 2 karena memiliki tag tambahan (urutkan, CLI) dan hapus baris # 1 dan # 3:
http://unix.stackexchange.com/questions/49569/ unique-lines-based-on-the-first-field
http://unix.stackexchange.com/questions/49569/ Unique lines based on the first field sort, CLI
http://unix.stackexchange.com/questions/49569/ Unique lines based on the first field
Apakah ada program untuk membantu mengidentifikasi "duplikat" seperti itu? Lalu, saya dapat membersihkan secara manual dengan menghapus baris # 1 dan # 3 secara pribadi?
sumber
Jawaban:
Jika saya mengerti pertanyaan Anda, saya pikir Anda perlu sesuatu seperti:
atau:
di mana
file.txt
file Anda yang berisi data tentang Anda tertarik.Dalam output Anda akan melihat jumlah garis dan garis di mana bidang pertama ditemukan dua kali atau lebih.
sumber
cut -d " " -f1 file.txt | uniq -d
memberi saya hasil yang bagus.Ini adalah masalah klasik yang bisa diselesaikan dengan
uniq
perintah.uniq
dapat mendeteksi duplikat baris berturut-turut dan menghapus duplikat (-u
,--unique
) atau menyimpan duplikat saja (-d
,--repeated
).Karena memesan garis duplikat tidak penting bagi Anda, Anda harus mengurutkannya terlebih dahulu. Kemudian gunakan
uniq
untuk mencetak garis unik saja:Ada juga opsi
-c
(--count
) yang mencetak jumlah duplikat untuk-d
opsi. Lihat halaman manualuniq
untuk detailnya.Jika Anda benar-benar tidak peduli tentang bagian-bagian setelah bidang pertama, Anda dapat menggunakan perintah berikut untuk menemukan kunci duplikat dan mencetak setiap nomor baris untuk itu (tambahkan yang lain
| sort -n
untuk memiliki output diurutkan berdasarkan baris):Karena Anda ingin melihat garis duplikat (menggunakan bidang pertama sebagai kunci), Anda tidak dapat langsung menggunakan
uniq
. Masalah yang membuat otomatisasi sulit adalah bahwa bagian-bagian judul bervariasi, tetapi suatu program tidak dapat secara otomatis menentukan judul mana yang harus dianggap sebagai judul akhir.Berikut adalah skrip AWK (simpan ke
script.awk
) yang mengambil file teks Anda sebagai input dan mencetak semua baris duplikat sehingga Anda dapat memutuskan mana yang akan dihapus. (awk -f script.awk yourfile.txt
)sumber
-w
(--check-chars
) untuk membatasi jumlah karakter tetap, tetapi melihat contoh Anda, Anda memiliki bidang variabel pertama. Karenauniq
tidak mendukung pemilihan bidang, Anda harus menggunakan solusi. Saya akan menyertakan contoh AWK karena itu lebih mudah.-w
tetapi panjang bidang pertama adalah variabel :(Jika saya membaca ini dengan benar, yang Anda butuhkan adalah sesuatu seperti
Itu akan mencetak nomor baris yang berisi dupe dan baris itu sendiri. Misalnya, menggunakan file ini:
Ini akan menghasilkan output ini:
Untuk hanya mencetak nomor baris, Anda bisa melakukannya
Dan hanya untuk mencetak garis:
Penjelasan:
The
awk
Script hanya mencetak ruang 1 dipisahkan bidang file. Gunakan$N
untuk mencetak bidang Nth.sort
mengurutkannya danuniq -c
menghitung kemunculan setiap baris.Ini kemudian diteruskan ke
while
loop yang menyimpan jumlah kemunculan sebagai$num
dan garis sebagai$dupe
dan jika$num
lebih besar dari satu (jadi itu digandakan setidaknya satu kali) itu akan mencari file untuk garis itu, gunakan-n
untuk mencetak nomor baris. The--
memberitahugrep
bahwa apa yang berikut adalah bukan pilihan baris perintah, berguna ketika$dupe
bisa mulai dengan-
.sumber
Tidak diragukan lagi yang paling bertele-tele dalam daftar, mungkin bisa lebih pendek:
berikan pada file teks seperti:
sebuah output seperti:
Setelah Anda memilih garis untuk dihapus:
sumber
Lihat yang diurutkan berikut
file.txt
:Karena daftarnya pendek, saya bisa melihat (setelah memilah) bahwa ada tiga set duplikat.
Lalu, misalnya, saya dapat memilih untuk tetap:
daripada
Tetapi untuk daftar yang lebih panjang ini akan sulit. Berdasarkan pada dua jawaban yang satu menyarankan
uniq
dan yang lainnya menyarankancut
, saya menemukan bahwa perintah ini memberi saya output yang saya inginkan:sumber
cut
. Jika Anda melakukan pekerjaan menduplikasi, maka nomor baris mungkin sangat membantu. Untuk mencetak semua duplikat, gunakan-D
opsi sebagai ganti-d
.for dup in $(cut -d " " -f1 file.txt | uniq -d); do grep -n $dup file.txt; done
seperti dalam jawaban saya. Ini akan memberi Anda pratinjau yang lebih baik tentang apa yang Anda minati.Inilah cara saya menyelesaikannya:
file_with_duplikat:
File diurutkan dan dideduksi berdasarkan kolom 1 dan 2:
File hanya diurutkan berdasarkan kolom 1 dan 2:
Hanya tampilkan perbedaan:
sumber