この一般構造の入力ファイルがあります。私は山の塊から値のステップと重みを抽出し、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に関する質問と回答詳細は、要点は、\s
GNU 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
コマンドの最後に追加します。
引用: