2012-07-28 10 views
8

koşullarına göre satırlardan birini yazdırmak için awk çözümü Ben buna benzeyen bir giriş dosyası var (ilk sütun bir konum numarası ve ikincisi zamanla artması gereken bir sayıdır) :Geçerli satırı sonraki satıra göre karşılaştırmak ve

1  0 
1  2 
1  6 
1  7 
1  7 
1  8 
1  7 
1  7 
1  9 
1  9 
1  10 
1  10 
1  9 
1  10 
1  10 
1  10 
1  10 
1  10 
1  10 
1  9 
1  10 
1  10 
1  10 
1  10 
1  10 
1  10 

ve bunun böyle (önceki sayımı azalmıştır yerine sayımları) bakmak düzeltmek istiyorum:

bunun için awk kullanmaya çalışıyorum
1  0 
1  2 
1  6 
1  7 
1  7 
1  8 
1  8 
1  8 
1  9 
1  9 
1  10 
1  10 
1  10 
1  10 
1  10 
1  10 
1  10 
1  10 
1  10 
1  10 
1  10 
1  10 
1  10 
1  10 
1  10 
1  10 

ama ben hat numarası (NR?) nasıl sıfırlayacağımı anlayamadığımdan, getline tökezleyerek Her satıra ead ve sıradaki satır, her seferinde iki satır değil. Şimdiye kadar sahip olduğum kod bu, herhangi bir fikir mi?

1  0 
1  6 
1  7 
1  7 
1  9 
1  10 
1  9 
1  10 
1  10 
1  9 
1  10 
1  10 
1  10 
+0

bir ayrıntılı versiyonudur Tamam, sadece açıklığa kavuşturmak için, sayımın azaldığı satırları * atlamaya mı çalışıyorsun? Çok fazla satır var, acaba bu kadar açık bir örnek verebilir misiniz? – Levon

+0

Açıklamamın açık olmaması durumunda, sayım azaldığında bir önceki satırı yazdırmak istiyorum, bu yüzden aynı sayıda satırla, ancak sayımın kaldığı ya da arttığını, ancak hiçbir zaman azalacağı bir dosyayla bitirmek istiyorum. – suegene

+0

Anladım .. aşağıda verilen cevapları kontrol edin, aradığınızı bulursunuz. – Levon

cevap

7

Belki bütün istediğim:

awk '{a=$1; b=$2; getline; c=$1; d=$2; if (a==c && b<=d) print a"\t"b; else print c"\t"d}' original.txt > fixed.txt 

Ayrıca, bu şu anda alıyorum çıkışı

awk '$2 < p { $2 = p } { p = $2 } 1' input-file 

Bu ilk satırda başarısız olur ise değer ikinci sütun negatif, bunu:

awk 'NR > 1 && $2 < p ...' 

Bu, eğer mevcut değer daha azsa ikinci sütunu bir önceki değere ayarlar, ardından mevcut değeri p değişkenine kaydeder, sonra çizgiyi yazdırır.

Ayrıca, bu durumun değişmekte olan satırlardaki aralığını da biraz değiştirdiğini unutmayın. girişinizi sekme ayrılmış ise, yapmak isteyebilirsiniz:

awk 'NR > 1 && $2 < p { $2 = p } { p = $2 } 1' OFS=\\t input-file 
+0

Vay be .. çok daha özlü .. Ben ilk çözümün ayrıntılı bir sürümü var düşünüyorum Sanırım – Levon

+0

Fantastik, sadece boşluk bırakmaya çalışıyordum, teşekkürler! – suegene

2

Bu komut sizin gibi yapacak:

{ 
    if ($2 < prev_count) 
    $2 = prev_count 
    else 
    prev_count = $2 

    printf("%d %d\n", $1, $2) 
} 

Bu kolayca okunabilir olması :)

+0

Teşekkürler, ben de ayrıntılı sürümü takdir ediyorum! – suegene

+0

@suegene Yardım etmekten mutluluk duyuyorum. Çıkış aralığını, ihtiyacınız varsa, format/aralık üzerinde biraz daha hassas kontrol sağlayan "printf" ile ayarlamıştım. – Levon