入力ファイルから特定の行を読む

入力ファイルから特定の行を読む

この一般構造の入力ファイルがあります。私は山の塊から値のステップと重みを抽出し、awk / sed / grepを使用して出力ファイルに入れたいと思います。山ブロックは、入力ファイル内で同様の方法で配置されます。

編集:私はMAC OSXを使用しています。

 configuration {
 step         5000
 dt 2.000000e+00
 }

colvar {
name d1
x  1.70882305580118e+01
v  0.00000000000000e+00
}

1.85104129628346e-02 9.71380137561312e-02 4.00538287370335e-02
1.25662994200839e-02 9.88655406140091e-02 1.41657757894898e-01

hill {
step            0
weight    1.00000000000000e-01
centers   1.23563844380284e+02
widths    1.25331413731550e+00
}
 hill {
 step          100
 weight    1.00000000000000e-01
centers   1.19065310650377e+02
widths    1.25331413731550e+00
}

他の答えで助けを見つけることができました。

 sed 's/^.*weight//' diol_colvar.colvars.state > hill.txt
 sed 's/^.*step//' diol_colvar.colvars.state > hill.txt

残念ながら、これは私が望む方法で動作しません。

私の出力は次のようになりたいです。

  0     1.00000000000000e-01
  100   1.00000000000000e-01

この問題を解決するのに役立ちます。

ありがとう、

ベストアンサー1

1)sed

stepとがweight連続した行に現れると仮定すると、

$ sed -nE '/step/{N;s/.*step\s+(\S+).*\n.*weight\s+(\S+).*/\1\t\2/p}' ip.txt 
0   1.00000000000000e-01
100 1.00000000000000e-01
  • -nEデフォルトでは、行を印刷せずに拡張正規表現を使用します。
  • /step/行に以下が含まれている場合は一致します。step
  • N次の行を取得

メモ:

上記は、でテストされましたGNU sed 4.2.2。以下は、OS Xやその他のバージョンに役立ちます。バラよりSOに関する質問と回答詳細は、要点は、\sGNU sedと同じように動作しないことです。

sed -nE '/step/{N;s/.*step[[:space:]]+([^[:space:]]+).*\n.*weight[[:space:]]+([^[:space:]]+).*/\1\t\2/p}' ip.txt

2)awk

$ awk 'a ~ /step/ && /weight/{print v"\t"$2} {a=$0; v=$2}' ip.txt 
0   1.00000000000000e-01
100 1.00000000000000e-01
  • {a=$0; v=$2}行と2番目のフィールドを保存
  • a ~ /step/ && /weight/step前の行に次が含まれ、現在の行に次が含まれている場合は一致します。weight

hillブロックがすべて与えられた入力に似ていると仮定すると、3つの連続する行を一致させることによってブロックのみをhill一致させるように制限できます。

awk 'b ~ /hill/ && a ~ /step/ && /weight/{print v"\t"$2} {b=a; a=$0; v=$2}' ip.txt

結果を保存するには、> output_filenameコマンドの最後に追加します。

引用:

おすすめ記事