Girdi verileri aşağıdaki 2. sütun göre sıralanır: Örnek bulguları, istenen çıkışı ileBaskı awk çiftler olarak belirli bir sütun göre belirli bir değer aralığı içinde olan tüm satırları
1 100
1 101
1 200
3 360
4 800
4 950
4 952
olup:
1 200 3 360
4 800 4 950
4 800 4 952
Yani, sütun 2'de değerler aralıkta olan satırlar varsa: value2, değer1 + 100'den büyükse & & value2 değeri1 + 200'den küçüktür.
girişimim oldu: karşılaştırmalar için değişkenlere önceki hattı ve önceki hat sütun 2 kaydeder
awk 'BEGIN{FS="\t"; PREVLOC=$2; PREVLINE=$0}{ if($2>PREVLOC+200 || $2<PREVLOC+100 {PREVLOC=$2; PREVLINE=$0;} else {print PREVLINE"\t"$0; PREVLOC=$2; PREVLINE=$0;} }' inputfile
. Ancak, her durumda çalışmaz. Örnek verilerle, son çifti basmayacaktı. Ayrıca, ikinci sütun değerinin ör. 890.
Şu anda, birlikte bash tamamen farklı bir şekilde problemini çözdük:
`while read var1 var2; do stuff with vars in awk; done<inputfile`
Ama çok yavaş. Herhangi bir yardım çok takdir edilmektedir.
Merhaba, çok teşekkürler. Tam olarak aradığım şey bu. Dosyalarımın her biri 100 k satıra sahiptir ve bunların 1000'lerine kadar olabilir (bunlar paralel olarak işlenir). Gerçek veriler daha birçok alanda daha karmaşıktır. Verilerle uğraşmak için geldiğim tek diğer yol, tüm olası çiftleri birleştirmek ve ardından awk, örn. örnek verilerle birlikte -1 -1 -2 1 -t $ '\ t' <(awk '{print 1 "\ t" $ 0}' inputfile) <(awk '{print 1 "\ t" $ 0} "inputfile) | awk 'BEGIN {OFS = FS = "\ t"} {if (5 $> 3 + 100 && 5 $ <3 $ + 200) 2 $ 3, $ 4, $ 5, $ 5}' ' – 5heikki
Harika !, yararlıdır. Http://backreference.org/2010/02/10/idiomatic-awk/ adresindeki "İki dosya işleme" bölümü, bu tür kendi kendine katılma sorunları için awk kullanmanın bu yolunda daha fazla açıklama sağlar (nerede Söz konusu iki dosya aynı dosyadır). – jas