使用 awk 或 sed 提取具有特定模式的部分行

使用 awk 或 sed 提取具有特定模式的部分行

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

我想将每种情况下关键字后面的值提取sum到一个单独的文件中。是否可以一次性完成?

答案1

grep

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

-P带(perl-regexp) 参数的 grep支持\K,用于忽略先前匹配的字符。

awk

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

awk该变量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

如果我正确理解了这个问题,您只想获取之后的值=,并根据第二个字段(?)将这些值存储在单独的文件中。如果我是对的,请尝试这样的事情:

$ 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

该脚本找出了两个连续的部分:

  1. 空格 和 之间:应包含一些(大于 0)非空格符号;
  2. =;之后有一些(大于 0)非空格符号

并从其正在执行的命令中通过管道传输到bash

相关内容