線の下または上のデータのインポート

線の下または上のデータのインポート

これは私のファイルです:

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

関連情報