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


18

awk / 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

それぞれの場合の合計後の値を個別のファイルに抽出したい。一度に行うことは可能ですか?

回答:


26

grepコマンドを使用:

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

-P(perl-regexp)パラメーター付きのgrepは\K、以前に一致した文字を無視するために使用します。

awkコマンドの場合:

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

Awk NFは、レコード/行のフィールドの総数を示します。したがって、その最後の値は、レコード/行の最後のフィールド番号です。

sedコマンドを使用:

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

^.*=sum.*line(^)の始まりと最後のcharacters()の間のすべてのcharacters(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

各値を個別のファイルに保存する場合は、上記のコマンドをwhileループに使用します。

while read line; do
    echo "$line" | grep -oP 'sum=\K.*'     > $(echo "$line" |awk '{print $2}');
   #echo "$line" | awk -F"=" '{print $NF}' > $(echo "$line" |awk '{print $2}');
   #echo "#line" | sed 's/^.*sum=//'       > $(echo "$line" |awk '{print $2}');
done < file

含まれていることsum=、それが後の値と同じではないsum=
Anthonの

OPは和の後の値が必要です。また、NFのawkの記述はひどいです。

1
この非常に良い答えを完成させるために、以下を使用することもできcutますcut -d'=' -f2 file
fedorqui 14

これは非常に良い答えです。私はそれが好き。ありがとうございました。
ジャファーウィルソン

6

質問を正しく理解したら=、の後に値のみを取得し、これらの値を2番目のfield(?)に基づいて別のファイルに保存します。私が正しいなら、このようなものを試してください:

$ 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

@KasiyA GNU awk 4.0.2の問題を再現できません。私の答えからのコマンドは、-cオプション(awkGNU拡張が無効になっている従来のUNIXとの互換モード)でも機能します。元の質問が編集され、空の行が削除されたため、入力ファイルを更新したことを確認してください。
jimmij

1

あなたはそれをすることができます sed

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

スクリプトは、次の2つの部分を見つけます。

  1. スペースと:との間には、いくつかの(0以上)非スペース記号を含める必要があります。
  2. 後にいくつかの(0を超える)非スペースシンボル=;

パイプを介して転送された実行コマンドからのフォーマット bash


はるかに汎用性の高い答え。
デュアネフ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.