簡體   English   中英

使用AWK正則表達式工具解析純文本

[英]Parsing plain text with AWK regex tools

我有印尼文的物理問題:

Dari salah satu bagian gedung yang tingginya 20 m,dua buah batu dijatuhkan secara berurutan。 Massa kedua batu masing-masing 1/2 kg dan 5 kg。 Bila percepatan gravitasi bumi di tempat itu g = 10 m / s2,tentukan waktu jatuh untuk kedua batu itu(阿拜坎語gesekan udara)

如下的英語翻譯(來自Google Translate ):

從高度為20 m的建築物之一中掉下兩塊岩石。 第二塊石頭的質量分別為1/2公斤和5公斤。 如果重力加速度在g = 10 m / s2,請確定它掉落到第二塊石頭的時間(忽略空氣摩擦)

我希望將此問題解析為以下形式:

Height = 20 m
Mass A = 1/2 kg 
Mass B = 5 kg
Gravity = 10 m/s2

到目前為止,我只有兩種形式的代碼。 這是第一個:

#只取數字

{
  for(i=1; i<=NF; i++){          
    if($i ~ /^[[:digit:]]+/)       
    print $i                 
  }
}

#只拿單位

{  
  for(i=1; i<=NF; i++){                     
  if(($i ~ /^m\/s2/) || ($i ~ /^kg$/) || ($i ~ /^m$/))      
      print $i  
  }
}

現在,如何結合這兩個awk代碼? 我做了這樣的聯合:

BEGIN { FS = "[, ]+" }  

#taking units

{  
  for(i=1; i<=NF; i++){                     
  if(($i ~ /^m\/s2/) || ($i ~ /^kg$/) || ($i ~ /^m$/))      
      print $i                                  
  }
}

#taking numbers

{
  for(i=1; i<=NF; i++){          
    if($i ~ /^[[:digit:]]+/) 
      print $i              
  }
}

但是上面的代碼將導致以下輸出:

master@master:~/Dokumen/Pelajaran/Semester 4/Pak Anom$ awk -f plasma.awk soal1 
m
20
kg
m/s2
1/2
5
10
master@master:~/Dokumen/Pelajaran/Semester 4/Pak Anom$ 

至少,我希望結果是這樣的:

20 m
1/2 kg 
5 kg 
10 m/s2

我想將此awk代碼用作物理鍛煉/問題自動計算的基礎,因此該基礎對我來說至關重要。 有什么建議嗎? 謝謝。

您可以嘗試如下操作:

awk '{
    for(i=1;i<=NF;i++) {
        gsub(/[,.]/,"",$(i+1))
        if($i~/^[[:digit:]]/) {
            print $i,$(i+1)
        }
    }
}' file

測試:

$ cat file
Dari salah satu bagian gedung yang tingginya 20 m, dua buah batu dijatuhkan secara berurutan. Massa kedua batu masing-masing 1/2 kg dan 5 kg. Bila percepatan gravitasi bumi di tempat itu g = 10 m/s2, tentukan waktu jatuh untuk kedua batu itu (Abaikan gesekan udara)

$ awk '{
    for(i=1;i<=NF;i++) {
        gsub(/[,.]/,"",$(i+1))
        if($i~/^[[:digit:]]/) {
            print $i,$(i+1)
        }
    }
}' file
20 m
1/2 kg
5 kg
10 m/s2

更新: if有條件獲得您想要的結果,請添加更多

$ awk '{
    for(i=1;i<=NF;i++) {
        gsub(/[,.]/,"",$(i+1))
        if($i~/^[[:digit:]]/ && $(i+1)=="m") {
            print "Height = "$i,$(i+1)
        }
        else if($i~/^[[:digit:]]/ && $(i+1)=="kg") {
            print "Mass "++x" = "$i,$(i+1)
        }
        else if($i~/^[[:digit:]]/ && $(i+1)=="m/s2") {
            print "Gravity = "$i,$(i+1)
        }
    }
}' file
Height = 20 m
Mass 1 = 1/2 kg
Mass 2 = 5 kg
Gravity = 10 m/s2

GNU 代碼

BEGIN { FS = "[ .,]"}
      {
            for (i = 1; i <= NF; i++) {
                 if ($i ~ /[0-9]/){
                    print($i, $(++i))
                    }
                }
            }

$awk -f a.awk file
20 m
1/2 kg
5 kg
10 m/s2

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM