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つの連続した部分を探します。
- スペースと;間には
:
空白以外の文字を含める必要があります(0より大きい)。 =
;後に空白以外の文字(0より大きい)が続きます。
実行中のコマンドからパイプに接続されます。bash