2016-03-24 19 views
1

Aynı satırları daraltmak (birkaç sütunla tanımlanır) için bir awk komut dosyası yazmaya çalışıyorum ve minimum değere sahip olan tüm satırı koru.Satırları daraltmak ve satırın tümünü bir sütun değerine göre tutmak için awk kodu

Bu benim örnek girişi:

A  20 30  Boston  US  3  tempCity  top 
A  20 30  London  UK  2  coldCity  top 
A  20 30  Singapore  SG  4  hotCity  top 
B  10 20  Tokyo  JP  3  coldCity  mid 

ilk, ikinci, üçüncü ve sekizinci sütunlar aynı ise, altıncı sütun asgari değere sahip olan tek bir satır devam etmek istiyorum.

awk -v OFS='\t' '{par=$1 OFS $2 OFS $3 OFS $8} $6<a[par]{a[par]=(par in a)?a[par]$0:$0} END {for (i in a) print i, a[i]}' cityList.txt 

ama sadece aşağıdaki çıktıyı var:

A  20  30  top 
B  10  20  mid  

Awk bir acemi olduğum bu kod yazmak çalıştık

A  20 30  London  UK  2  coldCity  top 
B  10 20  Tokyo  JP  3  coldCity  mid 

: Bu benim beklenen çıkışı Yani herhangi bir yardım çok takdir edilir! Şimdiden teşekkürler!

cevap

1

Neredeyse bitti! Anahtar tanımlı veya değeri geçerli anahtarın azdır değilken ayarlandıktan böylece

awk -v OFS='\t' '!a[$1,$2,$3,$8] || $6 < a[$1,$2,$3,$8] { a[$1,$2,$3,$8] = $0 } END {for (i in a) print a[i]}' file 

Ben, dizideki a değeri ayarlama hakkında koşulu değişti.

Her yerde $1,$2,$3,$8'u kullanmayı seçtim - yinelemekten kaçınmak istiyorsanız, $1 SUBSEP $2 SUBSEP $3 SUBSEP $8'u kullanarak buna eşit bir değişken ayarlayabilirsiniz. SUBSEP, anahtarın içeriğiyle çakışması pek olası olmayan bir kontrol karakteridir.

END'daki döngü bloğu, yalnızca, yapmaya çalıştığınız anahtarı birleştirmek yerine a[i]'da depolanan satırı yazdırır.

+0

Merhaba Tom okumak için! Çok teşekkürler! Sorunumu çözdü ve ben de yeni bir şey öğrendim. – kaka01

0

alternatif awk, belki de daha kolay hem de

$ sort -k6,6n cities | sort -u -k1,3 -k8 

A  20 30  London  UK  2  coldCity  top 
B  10 20  Tokyo  JP  3  coldCity  mid