awk koşulu doğru ve yanlış


9

Ben kullanırsak awk 0 inputfile, hiçbir şey yazdırmaz çünkü 0durumun yanlış anlamına gelir.

Eğer kullanırsak awk 1 inputfile, her şeyi 1awk interpret için her satır için doğru olarak yazdıracaktır .

Eğer kullanırsak awk any_string inputfile, hiçbir awk değişkeni sıfır olarak başlatıldığından yanlıştır.

Ama kullanırsak awk any_integer inputfile, bu gerçekleşecek ve dosyanın her satırını yazdıracak, sebebinin ne olduğunu öğrenebilir miyim?

Bunun GNU awkkılavuzunda açıklanmış olduğunu bulamıyorum .


3
tarafından any_integersana gibi ortalama edebi numarayı varsayalım 7, 89vb .. eğer öyleyse, neden dışında herhangi bir sayıdır 0vasıta truedurumuna
Sundeep

Yanıtlar:


13

Awk için true , boş olmayan bir dize veya sıfır olmayan bir sayıdır (sayılar ondalık tam sayı veya kayan nokta ve bazı awk uygulamaları ile onaltılık veya sekizli de desteklenir). Çift tırnak içine alınmış şeyler dizgidir, sıralanmamış değişmez sayılar sayıdır, ancak başka bir şey için bir şeyin dize mi yoksa sayı olarak mı ele alınacağını belirlemek için karmaşık kurallar vardır. GNU awkkılavuzunun bununla ilgili bir bölümü var .

Doğru:

  • awk '1' (sıfır olmayan sayı)
  • awk '1e8' (sıfır olmayan sayı)
  • awk '-0.01' (sıfır olmayan sayı)
  • awk '"foo"' (boş olmayan dize)
  • awk '"0"' (boş olmayan dize)
  • awk '0 ""' (birleştirme burada boş olmayan bir dize verir)
  • echo 0 | awk '$1 ""' ($ n alanı için aynıdır)
  • awk 'substr("000", 1, 1)'(sonucu substr()her zaman bir dizedir)
  • echo '0foo' | awk '$0' ($ 0 sayısal olmayan bir dizedir, bu nedenle dize (boş olmayan) olarak kabul edilir)

Yanlış:

  • awk '0' (0 numara)
  • awk '""' (boş dize)
  • echo 0000e123 | awk '$1' ($ 1, burada olduğu ve 0 olduğu sayısal bir dize ise sayı olarak kabul edilir)
  • echo ' 0 ' | awk '$0' (bir dizenin sayısal olup olmadığını belirlemek için öndeki ve arkadaki boşluklar yok sayılır).
  • awk '" 2foo" - 2' (aritmetik ifadede yer alan bir dize yok sayılan sayıyı aşan bir sayıya dönüştürülür)
  • awk 'unset_or_empty_variable' (boş dize)
  • awk '"non-numerical-string" + 0'

YMMV:

  • awk '1e-500' (bazıları şikayet edecek, bazıları 0 olarak kabul edecek)
  • awk '"0x1" + 0'(tüm awk'ler anlamına olanlara, Heksadesimalleri destekleyen "0x1"dönüştürülür 1için başkalarında, 0orada o onaltılık numarasını destekleyecek yanlışlıkla gerekli uygulamalar. POSIX şartnamenin bazı sürümü ve daha sonra geri çekilmiş oldu. Hala gawkzaman o onaltılık numarasını tanımıyor POSIXLY_CORRECTiçindedir Çevre)
  • awk '010 - 8' (aynı (sekizlik için dönüştürülmek yerine burada 010 tam anlamıyla değil) sekizli için)
  • awk '0x1 - 1'( awkonaltılık sayıları desteklemeyen uygulamalarda, sıfırdan farklı bir sayı elde ederseniz, çıkarırsanız, bir sayıya (0) dönüştürülen 0x1birleştirme 0ve x1sonuç "0"veren değişkendir ).1-1

Bunun anlamı, bir dizenin boş olup olmadığını kontrol etmek istiyorsanız, şunları yapmamanız gerektiğidir:

awk '$ 1 {print $ 1, "boş değil"}'

Fakat

awk '$1 != "" {print $1, "is not empty"}'

Aksi takdirde söylemezdim 0veya -0000E+00001234olmayan boş.


Etkileyici ve ayrıntılı cevap! Yine de bir soru: verdiğiniz son örnekte, sözdizimini denedim ve ilki işe yarıyor, burada boş olan 1 $ 'ı atlıyor ve sadece 1 $ boş olmayan bu satırı yazdırıyor, çünkü $ 1 boş dize ise Yanlış, dolayısıyla çıktıyı basmıyor, değil mi?
sylye
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.