2016-04-13 32 views
1

Bir metin dosyasında benzersiz satırları aramak zorundayım, ancak ek bir ayar vardır. İlk kısmı (bir nokta ile ayrılmış) eşit olan satırları kopya olarak düşünmem gerekiyor. Örneğin :bash bir dosyada benzersiz satırlar bul

DEASLR98 
DEASLR98.acme.it 

Bu hatlar eşit olan, ancak

sort file.txt | uniq 

ikisini de içermektedir. Tam alan bilgisiyle (ör. DEASLR98.acme.it) sadece satırın nasıl ekleneceği ile ilgili herhangi bir öneri? Teşekkürler!

+0

"DEASLR98.foo.bar" ve "DEASLR98.example.com" varsa, hangisinin kazanması gerekir? – tripleee

cevap

1

Burada, her anahtar için en uzun eşleşmeyi tutan basit bir Awk uniq uygulaması var.

awk -F . '!($1 in a) || length(a[$1]) < length($0) { a[$1] = $0 } 
    END { for (k in a) print a[k] }' file.txt 

-F . nokta her bir giriş hattını ayırmak için AWK talimatını verir. Böylece $1, ilk noktadan önceki alanı içerir. Bu alan a dizisinden eksikse veya bu anahtarın varolan değerinden daha uzunsa, dizide tüm giriş satırını ($0) tutuyoruz. Sonunda, dizideki değerleri yazdırıyoruz. Bu açıkça dizinin belleğe sığmasını gerektirecektir.