これは私のファイルです:
print energy 1 end
Local net energy (PE 0) = 1.635393034217E+05 kJ/mol
Global net ELEC energy = 1.635393034217E+05 kJ/mol
print energy 2 end
Local net energy (PE 0) = 1.682997967326E+05 kJ/mol
Global net ELEC energy = 1.682997967326E+05 kJ/mol
数字が必要ですが、どちらが適しているかを知る唯一の方法はラインですprint
。これまで、私はこのコマンドを使って問題を解決しました。
tail -16 file.txt | head -1 | awk '{print $6}'
しかし、この方法は良くないと思います。行番号に依存する必要があります。データが数千行の途中にある場合は失われます。これについてのより良いオプションを知っていますか?
答え1
埋め込み(推測)各フィールドの後に2行目の6番目print
のフィールドを印刷すると仮定すると、次のようになります。
awk '/print/{if (getline > 0 && getline > 0) print $6}'
または:
awk '!--n {print $6}; /print/ {n=2}'
最初の行の最後のフィールドにGlobal
最初の項目の後に表示されるフィールドを含めるには、次の手順を実行しますprint energy 1 end
。
awk '/print energy 1 end/{found=1}; found && /Global/ {print $(NF-1); exit}'
ゲームの上の行のデータを印刷するには、まずデータを記録してからプレイしながら記録したデータを印刷する必要があります。たとえば、次を含む最初のフィールドの前の行にある6番目のフィールドを印刷しますprint
。
awk '/print/{print recorded;exit};{recorded=$6}'
答え2
サンプルデータに基づいてGNU grep
解決策は次のとおりです。
$ grep -oP '(?<== ).+? ' file
1.635393034217E+05
1.635393034217E+05
1.682997967326E+05
1.682997967326E+05
答え3
切り取りを使用することもできます。
cut -d "=" -f2 file
「kJ/mol」が不要な場合は、配管にawkを使用してください。
cut -d "=" -f2 file | awk '{print $1}'
答え4
私はすべてのprintステートメントが空行で区切られていると仮定し、printを含む各ステートメントの後に2行目の6番目のフィールドを印刷するとします。
$ cat ccc
print energy 1 end
Local net energy (PE 0) = 1.635393034217E+05 kJ/mol
Global net ELEC energy = 1.635393034217E+05 kJ/mol
print energy 2 end
Local net energy (PE 0) = 1.682997967326E+05 kJ/mol
Global net ELEC energy = 1.682997967326E+05 kJ/mol
Read energy 3 end
Local net energy (PE 0) = 1.635393034217E+05 kJ/mol
Global net ELEC energy = 1.635393034217E+05 kJ/mol
$ awk -v RS='\n\n' '/print/{gsub (/\n/,""); {print $18}}' ccc
1.635393034217E+05
1.682997967326E+05