使用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

我想在每种情况下将总和后的值提取到单独的文件中。可以一次这样做吗?

Answers:


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(^)开头和最后一个character()之间的所有character()替换sum=为空白char。

结果:

-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 2014年

OP要求和后的值,NF的awk描述也很糟糕。

1
要完成此非常好的答案,您还可以使用cutcut -d'=' -f2 file
fedorqui 2014年

这是一个很好的答案。我喜欢 谢谢。
贾弗·威尔逊

6

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

$ 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选项(与awk禁用GNU扩展的传统UNIX兼容的模式)。请确保您已更新输入文件,因为原始问题已被编辑,空行已删除。
jimmij 2014年

1

你可以做到 sed

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

该脚本找出了两行:

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

并通过通过管道传输到的执行命令中的格式进行格式化 bash


一个更加通用的答案。
duanev'8
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.