awkまたはsedを使用して、特定のパターンを持つ行の一部を抽出します。

awkまたはsedを使用して、特定のパターンを持つ行の一部を抽出します。

awk/operatorについて質問がありますsed。次の行が繰り返される大きなファイルがあります。

Expression loweWallrhoPhi :  sum=-6.97168e-09
Expression leftWallrhoPhi :  sum=6.97168e-09
Expression lowerWallPhi :  sum=-5.12623e-12
Expression leftWallPhi :  sum=5.12623e-12
Expression loweWallrhoUSf :  sum=-6.936e-09
Expression leftWallrhoUSf :  sum=6.97169e-09
Expression lowerWallUSf :  sum=-5.1e-12
Expression leftWallUSf :  sum=5.12624e-12

sum各場合のキーワードの後に​​出てくる値を別々のファイルに抽出したいと思います。一度に可能でしょうか?

答え1

そしてgrep

grep -oP 'sum=\K.*' inpufile > outputfile

-P以前に一致した文字を無視するための(perl-regexp)パラメータを使用したgrepサポート\K

そしてawk

awk -F"=" '{ print $NF; }' inputfile > outputfile

存在するアッこの変数は、NF現在のレコード/行の合計フィールド数を表し、最後のフィールド番号を指すため、それ$NFに応じて値が割り当てられます。

そしてsed

sed 's/^.*sum=//' inpufile > outputfile

^.*=sum.*行の最初の文字()と最後の文字()の間の^すべての文字()をsum=空白文字に置き換えます。

結果:

-6.97168e-09
6.97168e-09
-5.12623e-12
5.12623e-12
-6.936e-09
6.97169e-09
-5.1e-12
5.12624e-12

そしてcut

cut -d'=' -f2 inputfile > outputfile

同じ値を同じファイルに別々に保存するには、awk次のようにします。

awk -F"=" '{print $NF >($NF); }' inputfile > outputfile

答え2

質問を正しく理解したら、それ以降の値のみを取得し、=2番目のフィールド(?)に基づいて別々のファイルに保存したいと思います。私が正しい場合は、次のようにしてみてください。

$ awk -F'[ =]' '{print $6>"file_"$2".txt"}' file

結果:

$ ls -1
  file_leftWallPhi.txt
  file_leftWallUSf.txt
  file_leftWallrhoPhi.txt
  file_leftWallrhoUSf.txt
  file_loweWallrhoPhi.txt
  file_loweWallrhoUSf.txt
  file_lowerWallPhi.txt
  file_lowerWallUSf.txt

$ cat  file_leftWallPhi.txt
  5.12623e-12

答え3

あなたはこれを行うことができますsed

sed -E 's/^.* (\S+)\s*:.*=(\S+)/echo "\2" > "\1".txt/' file | bash

スクリプトは2つの連続した部分を探します。

  1. スペースと;間には:空白以外の文字を含める必要があります(0より大きい)。
  2. =;後に空白以外の文字(0より大きい)が続きます。

実行中のコマンドからパイプに接続されます。bash

関連情報