“for” döngüsünü “if” ifadesiyle birleştirerek


1

Awk için bir komut dosyası hazırladım. Döngüsünü "için" "if" ifadesiyle birleştiriyorum. Her bir çizgiyi, "ABC" kelimesini arayarak sırayla farklı bir yerde bulabilir. Aşağıdaki gibi görünüyor:

{((i = 1; i & lt; = NF; i ++) için ($ i == "ABC") $ (i-2) yazdırırsa}

Satırda "ABC" olmadığında ve bu konuda bilgi yazdırmak istediğimde sorun ortaya çıkıyor. Aşağıdaki komut dosyasıyla, "ABC" den farklı olan satırdaki her kelime için bana bir bilgi veriyor ve satır için SADECE BİR bilgi istiyorum (her kelime için değil).

{((i = 1; i & lt; = NF; i ++) için ($ i == "ABC") $ (i-2) yazdıysa

Aksi halde ($ i == "ABC") "satırında ABC yok" yazdıysa

Saygılarımızla, lucas

Yanıtlar:


2

Komut dizinize, satırın her bir alanını (kelimesini) açıkça kontrol etmesini söylediniz. Yapmak istediğiniz şey, satırın herhangi bir yerindeki ABC dizesini içerip içermediğini kontrol etmektir:

awk '{
      if(/ABC/){
        printf "line %s contains ABC
      }
       else{
       printf "line %s does not contain ABC\n",NR
      }
     }' file.txt

Bunu, aşağıdaki içerikleri içeren bir dosyada çalıştırırsanız:

 this line has no string of interest
 this line contains ABC somewhere

olsun:

line 1 does not contain ABC
line 2 contains ABC

Neden baskı yaptığını açıklamamışsın. $(i-2) ama gerçekten ihtiyacınız olan şey buysa, şunları yapabilirsiniz:

awk '{k=0; for (i=1;i<=NF;i++){
            if ($i=="ABC"){print $(i-2); k++}
           } 
           if(k==0){print "No ABC in line",NR}
     }' file.txt

Hile değişken k. Her satırın başında 0 olarak ayarlanır. Tarlalara girdiğinizde, bunlardan biri eşleşirse ABC, k ayarlandı 1. Bu nedenle, tüm alanlar işlendikten sonra, k hala 0, çizgi içinde hiçbir ABC ve bir mesaj yazdırılır. Bu betiği yukarıda verdiğim örnek dosya üzerinde çalıştırmak:

No ABC in line 1
line

0

Adlı bir değişken bildirmeyi deneyin isFound senden önce for döngü. Sonra print $(i-2), ayarla isFound için true. Mevcut olanı değiştir elseif bir ile if deyim söyleyerek eğer isFound yanlış, sonra yazdır no ABC in line.

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.