Boş satırları tutarken awk ile yinelenen satırlar nasıl kaldırılır?


13

Aşağıdaki awkkomut , burada açıklandığı gibi tüm yinelenen satırları kaldırır :

awk '!seen[$0]++'

Metin boş satırlar içeriyorsa, bir boş satır dışındaki tümü silinir.

Nasıl tüm boş satırları tutabilir tek kullanarak, tüm boş olmayan yinelenen satırları silme iken awk? Lütfen kısa bir açıklama da ekleyin.

Yanıtlar:


28

Başka bir seçenek kontrol etmek NF, örneğin:

awk '!NF || !seen[$0]++'

11

alternatif olarak

awk '!/./ || !seen[$0]++' file

Ana hile aynıdır, ilişkilendirilebilir dizide anahtarı geçerli satır ( ) olan seen[$0]++bir giriş oluşturur . Bu nedenle, bu çizgi zaten görülmüşse yanlış olur. Böylece, çizgi olmayan herhangi boş karakterler içerip içermediğini kontrol ediyor olmayan boş satırlar eşleşir. Onunla birlikte boş olanlar hariç tüm yinelenen satırları yoksayar ve gerisini yazdırır.seen$0!seen[$0]++/./!/./|| !seen[$0]++


Bence bu cevap kabul edilmiş olmalı. Açıklama için +1!
SS Anne

5
awk '/^[[:blank:]]*$/ { print; next; }; !seen[$0]++'

Tek yapmanız gereken önce boş (gerçekten boş veya sadece boş) bir çizgi olup olmadığını kontrol etmektir.


5

awk@ Thor'un cevabına benzer başka bir çözüm daha az özlü ama daha verimli:

awk '!NF {print;next}; !($0 in a) {a[$0];print}' file

Bununla sadece a[$0]var olup olmadığını kontrol ederiz . Değilse, başlattıktan sonra yazdırın. Bu durumda, var olup a[$0]olmadığına dair herhangi bir referansımız, atamamız yoktur .


288 satırlı test dosyamda önemli bir zaman farkı ölçmedim. Ancak, kodunuz kesinlikle en okunabilir olduğu için ödülü yakalar.
Serge Stroobandt
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.