1

インドネシア語で物理の問題があります:

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)

以下のように英語に翻訳します(Google翻訳から):

20mの高さの建物の1つから、2つの岩が落とされます。2 番目の石の塊はそれぞれ 1/2 kg と 5 kg です。g = 10 m/s2 での重力加速度の場合、2 番目の石に落ちた時間を求めます (空気摩擦は無視します)。

この問題を次の形式に解析したい:

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

これまで、コードは 2 つの形式しかありませんでした。これは最初です:

#数字だけ取る

{
  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  
  }
}

では、これら 2 つの 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コードを物理的な演習/問題の自動計算の基礎として使用したいので、この基礎は私にとって非常に重要です。なにか提案を?ありがとうございました。

4

2 に答える 2

4

次のようなことを試すことができます:

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
于 2013-06-26T06:00:28.463 に答える
3

GNU

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

$awk -f a.awk ファイル
20メートル
1/2kg
5キロ
10m/s2
于 2013-06-26T05:51:35.720 に答える