2016-03-19 23 views
0

Aşağıdaki input dosyasında blankblank satırlarını yazdırmak için $5. awk, sonuçları çalıştırır ve sonuç verir, ancak yalnızca boş olan satırları değil, tüm girdi dosyasıdır. Benim awk sürümüm GNU 4.0.1. Teşekkür ederim :)awk kullanarak dosyada boş yazdırma hatları

giriş

chr6 32945523 32945792  chr6:32945523-32945792  BRD2-351|gc=50 
chr6 32945892 32946175  chr6:32945892-32946175  BRD2-352|gc=53.5 
chr6 32946856 32946981  chr6:32946856-32946981 
chr6 32947594 32947919  chr6:32947594-32947919  BRD2-354|gc=51.2 

istenen sonuç

chr6 32946856 32946981  chr6:32946856-32946981 

awk

cat input | awk 'BEGIN {FS="\t"} $5=="" {print}' 

akım çıkışı

cat input | awk 'BEGIN {FS="\t"} $5=="" {print}' 
chr6 32945523 32945792  chr6:32945523-32945792  BRD2-351|gc=50 
chr6 32945892 32946175  chr6:32945892-32946175  BRD2-352|gc=53.5 
chr6 32946856 32946981  chr6:32946856-32946981 
chr6 32947594 32947919  chr6:32947594-32947919  BRD2-354|gc=51.2 
chr6 32948108 32948251  chr6:32948108-32948251  BRD2-355|gc=43 

düzenleme: awk eser altında ancak orijinal Sana bir saha ayırıcı belirleyerek konum neden emin değilim

awk '$5==""' input 
+3

NF == 4 için test yerine – stark

+1

Programınız benim için iyi çalışıyor --- alanlarınızın sekmeyle ayrılmış olduğundan kesinlikle emin misiniz? Ayrıca isterseniz, 'awk' BEGIN {FS = "\ t"}! 5 $ 'gibi biraz daha kısa yazabilirsiniz.Ve sizin alanlarınızın iç boşlukları olmadığı anlaşıldığından, 'awk'! $ 5 'muhtemelen bunu da yapardı. – jas

+1

'awk '! $ 5', sayısal olarak sıfırlanan her şey $ 5’de sıfır olursa başarısız olur. @Chris hata ayıklamak için bu betiği çalıştırın: tr '\ t' '#'

cevap

1

değil neden yaptığını emin değilim (FS) sekmesi (\t). Bu sadece bir TSV dosyanız varsa gereklidir (CSV'ye benzer sekmeyle ayrılmış değerler). Gerçekten bir TSV dosyanız varsa, bazı değerlerde boşluklar ve/veya iki ardışık sekme ortadaki boş bir alanı gösterirse, awk 'BEGIN {FS="\t"} …' veya daha kısa olan awk -F '\t' '…''a ihtiyacınız vardır.

bu deneyin: Bazı boş alanları içeren bir TSV biçimi varsa

awk 'NF < 5' input 

, şunu deneyin:

İşte
awk -F '\t' '$5 == ""' input 

sekmeleri temsil etmek HTML'ın yetersizlik verilen daha güvenilir bir test var:

sample() { 
    echo 'chr6\t32945523\t32945792\tchr6:32945523-32945792\tBRD2-351|gc=50' 
    echo 'chr6\t32945892\t32946175\tchr6:32945892-32946175\tBRD2-352|gc=53.5' 
    echo 'chr6\t32946856\t32946981\tchr6:32946856-32946981' 
    echo 'chr6\t32947594\t32947919\tchr6:32947594-32947919\tBRD2-354|gc=51.2' 
    echo 'chr6\t32947594\t32947919\tchr6:32947594-32947919\t\ttest' 
    echo 'chr6\t32947594\t\tchr6:32947594-32947919\tBRD2-354|gc=51.2' 
} 

echo "unfiltered" 
sample 

echo "testing awk 'NF < 5'" 
sample |awk 'NF < 5' 

echo "\ntesting awk -F '\\\\t' '\$5 == \"\"'" 
sample |awk -F '\t' '$5 == ""' 

Son iki satır sample(),arasındaki farkı gösterir.varsayılanı (bir veya daha fazla boşluk karakteriyle eşleşen FS="[ \t]+") ve FS="\t".

Varsayılan olarak, 3 ve 5 alanları arasındaki boşluklar (TSV alanı 5, awk alan 4) olduğundan, bu kısa çizgiyi ve son satırı elde edersiniz. "Test" çizgisi, TSV alanını 6 awk alan 5'e sıkıştırır, böylece varsayılan değer bunu kaçırır.

Değiştirilen alan ayırıcısı da bu kısa çizgiyi alacaktır. Bir "TSV" için alanlar sayar, "test" çizgisinin boş bir beşinci girişe sahip olduğunu ("testin" altıncı girişi) olduğunu ve son çizginin eksik üçüncü alanının daraltılmış yerine boş olarak not edildiğini ve "BRD2" değerinin olduğunu Beşinci TSV alanı olarak uygun şekilde not edildi.

unfiltered 
chr6 32945523 32945792 chr6:32945523-32945792 BRD2-351|gc=50 
chr6 32945892 32946175 chr6:32945892-32946175 BRD2-352|gc=53.5 
chr6 32946856 32946981 chr6:32946856-32946981 
chr6 32947594 32947919 chr6:32947594-32947919 BRD2-354|gc=51.2 
chr6 32947594 32947919 chr6:32947594-32947919  test 
chr6 32947594  chr6:32947594-32947919 BRD2-354|gc=51.2 

testing awk 'NF < 5' 
chr6 32946856 32946981 chr6:32946856-32946981 
chr6 32947594  chr6:32947594-32947919 BRD2-354|gc=51.2 

testing awk -F '\t' '$5 == ""' 
chr6 32946856 32946981 chr6:32946856-32946981 
chr6 32947594 32947919 chr6:32947594-32947919  test 
+0

Hepinize teşekkür ederim :) – Chris