私は巨大なシミュレーションログファイル(約6GB)を持っています。このファイルには、数百万行のうち特定の時間に頻繁に繰り返される2行があります。
...
Max value of omega = 3.0355
Time = 0.000001
....
Max value of omega = 4.3644
Time = 0.000013
...
Max value of omega = 3.7319
Time = 0.000025
...
...
...
Max value of omega = 7.0695
Time = 1.32125
...
... etc.
「オメガの最大値」と「時間」を抽出し、単一ファイルの列として保存したいと思います。
#time max_omega
0.000001 3.0355
0.000013 4.3644
0.000025 3.7319
...etc.
私は次のように進みます:
# The following takes about 15 seconds
grep -F 'Max value of omega' logfile | cut -d "=" -f 2 > max_omega_file.txt
、「時間」も同様です
# This also takes about 15 seconds
# Very important: match exactly 'Time =' because there other lines that contain the word 'Time'
grep -F 'Time =' logfile | cut -d "=" -f 2 > time.txt
その後、このコマンドを使用して2つの列ファイルを生成する必要がありますpaste
。最初の列はTime.txtで、2番目の列は「max_omega_file.txt」です。
ご覧のとおり、上記の手順は2倍の時間がかかります。一度に同じ結果を達成して時間を節約するソリューションがあるかどうか疑問に思います。
ベストアンサー1
sed -n '/^Max/ { s/^.*=\s*//;h; };
/^Time/{ s/^.*=\s*//;G; s/\n/ /;p; }' infile
一致実行構文
/.../{ ... }
:
ここに含まれるコマンドは、{...}
正規表現/パターンと一致する行でのみ実行されます/.../
。s/^.*=\s*//
:末尾と空白(存在する場合)
の両方を削除します。=
\s*
h
:
結果を予約済みスペースにコピーします。G
:
改行文字を含むパターンスペースに予約済みスペースを追加します。s/\n/ /
:
埋め込み改行文字をパターンスペースのスペースで置き換えます。p
:
パターンスペースを印刷します。P
ここでコマンドを使用することもできます。0.000001 3.0355 0.000013 4.3644 0.000025 3.7319 1.32125 7.0695
同様の方法を提案@stevesliwaこれはs//<replace>/
、最後のゲームで交換を実行することを簡単に表現したものです。
sed -n '/^Max.*=\s*/ { s///;h; };
/^Time.*=\s*/{ s///;G; s/\n/ /;p; }' infile