2

私はAWKにまったく慣れていませんが、これが私の問題を解決するための最良の方法であり、AWKを学ぶ良い機会だと思います。シミュレーションプログラムで作成された大きなデータファイルを読み込もうとしています。出力は人間が読めるように作られているため、フォーマットはあまり一貫していません。出力の例はこの画像にあり ますhttp://i.imgur.com/0kf8l.png

「He24686A」の部分を指定して、次の2つの数値を取得することにより、「He 2 4686A-2.0880.0071」のような行を見つける方法が必要です。問題は、「He 2 4686A-2.0880.0071」という行がテーブルのどこにでも表示される可能性があることです。エントリ「He24686A」を見つける方法は知っていますが、4つの列のどれにあるかわかりません。したがって、それに続く値に対処する方法がわかりません。次の2つの単語を読み取るだけのコマンド、または一致するものが見つかったらパターンの場所を教えてくれるコマンドの両方が役立ちます。

/ He 24686A/行を見つける

Ca A 3970A -0.900 0.1100 He 2 4686A -2.088 0.0071 S 3 18.67m -0.371 0.3721 Ar 4 444.7A -2.124 0.0066

どんな助けでも大歓迎です。

4

2 に答える 2

2

最初のステップは、4列のレコードのように見えるものを1列の形式にすることです...その後awk、最初の5つのフィールドをフィルタリングできるため、次のように簡単に実行できます。

echo "He 2 4686A -2.088 0.0071" | \
awk '$1 == "He" && $2 == 2 && $3 == "4686A" {print $4, $5}'

これは

-2.088 0.0071

したがって、私にとって唯一の課題は、データを1列の形式に変換することです...そして、列の長さが固定されているように見えるため、単純に見える画像から、数えることができます。

列幅が30文字(画像から見分けるのは難しい、タブに注意)であり、データが入っていると仮定すると、input_file最初にデータを4列に「カット」してから、出力を別のプロセスにパイプすることができますawk

awk '{
  print substr($0,1,30)
  print substr($0,31,30)
  print substr($0,61,30)
  print substr($0,91,30)
}' input_file | \
awk '$1 == "He" && $2 == 2 && $3 == "4686A" {print $4, $5}'

アンカーの後ろにある次の2つの数字が本当に必要な場合はgrep、Costaの-solutionが最適ですが、これにより、さらにロジックを実装する可能性があります...

于 2012-08-16T19:51:58.843 に答える
2

If you're not dead set on using awk, grep would be the easiest way...

egrep -o "He 2 4686A \-?[0-9.]+ \-?[0-9.]+" output.txt

EDIT: The above would work only if the spacing was done with a whitespace, which doesn't seem to be your case. In order to handle tabs and/or repeating whitespaces...

egrep -o "He[ \t]+2[ \t]+4686A[ \t]+\-?[0-9.]+[ \t]+\-?[0-9.]+" output.txt

于 2012-08-16T19:55:03.723 に答える