[英]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 awk的代碼
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.