';grep';或';awk&x27;用于从文件中提取数字数据

';grep';或';awk&x27;用于从文件中提取数字数据,awk,grep,Awk,Grep,我有一个包含字母数字数据的CFD输出文件。我的目标是提取某些具有数字数据的行,以便能够绘制。我能够使用grep提取以数值开头的数据。但是,这些提取数据的某些行以数字开头,但也包含我不想要的字母。这是一个样本 3185 interface metric data, zone 1444, binary. 33268 interface metric data, zone 1440, binary. 3d, double precision, pressure-based

我有一个包含字母数字数据的CFD输出文件。我的目标是提取某些具有数字数据的行,以便能够绘制。我能够使用grep提取以数值开头的数据。但是,这些提取数据的某些行以数字开头,但也包含我不想要的字母。这是一个样本

    3185 interface metric data, zone 1444, binary.

   33268 interface metric data, zone 1440, binary.

      3d, double precision, pressure-based, SST k-omega solver.

1  1.0000e+00  1.0163e-01  4.9782e-06  1.2250e-05  6.5126e-06  3.8876e+01  4.1845e+03  7.8685e+02  7.9475e+02  7.8234e+02  3.0537e+00  4.4427e+02 106:48:28 4999

2  1.0000e+00  6.5455e-02  1.4961e-04  2.2052e-04  1.3530e-02  6.8334e-01  4.5948e-01  7.9448e+02  8.0249e+02  7.9007e+02  1.3742e+00  5.7040e+02 92:12:06 4998

    4587 interface metric data, zone 2541, binary.

   6584 interface metric data, zone 1254, binary.

3  1.0000e+00  4.2029e-02  1.5227e-04  2.1588e-04  3.0255e-03  6.4570e-01  1.2661e-01  7.8044e+02  7.9048e+02  7.7804e+02 -2.3999e+05  6.4085e+02 80:35:24 4997

4  9.9121e-01  3.0808e-02  1.1390e-04  1.7132e-04  1.6542e-03  6.0594e-01  3.4626e-02  7.8613e+02  7.9673e+02  7.8422e+02 -1.9033e+05  7.0184e+02 70:56:41 4996
这是我在grep-p'^\s*\d+'文件中使用的命令。我如何修改grep命令以只给我最后一行数字数据

    1  1.0000e+00  1.0163e-01  4.9782e-06  1.2250e-05  6.5126e-06  3.8876e+01  4.1845e+03  7.8685e+02  7.9475e+02  7.8234e+02  3.0537e+00  4.4427e+02 106:48:28 4999
    2  1.0000e+00  6.5455e-02  1.4961e-04  2.2052e-04  1.3530e-02  6.8334e-01  4.5948e-01  7.9448e+02  8.0249e+02  7.9007e+02  1.3742e+00  5.7040e+02 92:12:06 4998
    3  1.0000e+00  4.2029e-02  1.5227e-04  2.1588e-04  3.0255e-03  6.4570e-01  1.2661e-01  7.8044e+02  7.9048e+02  7.7804e+02 -2.3999e+05  6.4085e+02 80:35:24 4997
    4  9.9121e-01  3.0808e-02  1.1390e-04  1.7132e-04  1.6542e-03  6.0594e-01  3.4626e-02  7.8613e+02  7.9673e+02  7.8422e+02 -1.9033e+05  7.0184e+02 70:56:41 4996
我如何修改grep命令以只给我最后4行

通过管道将grep输出传输到
tail

grep -P '^\s*\d+' file | tail -n 4
我如何修改grep命令以只给我最后4行

通过管道将grep输出传输到
tail

grep -P '^\s*\d+' file | tail -n 4

如果所需的数据部分可以通过某个标题识别,例如,标题前面的
3d,
,则可以查找标题,然后才开始打印匹配行,例如

awk '/^\s*3d,/ { in_data=1; next } in_data && /^\s*[0-9]/' file
此处
/^\s*3d,/
是标头的模式,指示“数据段”的开头(从下一行开始,即不包括标头本身)。而
/^\s*[0-9]/
是数据段中要打印的行的模式

如果没有这样的头,您可以尝试用更复杂的模式识别第一行数据本身,例如,与正则表达式组合的字段数:

awk 'NF == 15 && /^\s*[0-9]*\s*/ { in_data=1 } in_data && /^\s*[0-9]/' file

如果所需的数据部分可以通过某个标题识别,例如,标题前面的
3d,
,则可以查找标题,然后才开始打印匹配行,例如

awk '/^\s*3d,/ { in_data=1; next } in_data && /^\s*[0-9]/' file
此处
/^\s*3d,/
是标头的模式,指示“数据段”的开头(从下一行开始,即不包括标头本身)。而
/^\s*[0-9]/
是数据段中要打印的行的模式

如果没有这样的头,您可以尝试用更复杂的模式识别第一行数据本身,例如,与正则表达式组合的字段数:

awk 'NF == 15 && /^\s*[0-9]*\s*/ { in_data=1 } in_data && /^\s*[0-9]/' file

考虑到问题中的文本是我们唯一要做的事情,我看到了一些我们可能用来提取最后四行的模式

以下匹配第一个字段为数字且不包含逗号的行:

egrep '^[[:space:]]*[0-9][^,]+$'
这一行与科学记数法中包含数字的行相匹配:

grep '[0-9]e[+-][0-9]'
这一行与包含时间的行相匹配,该时间在行尾后跟一个整数:

egrep '[0-9]+(:[0-9]{2}){2} [0-9]+$'
或者,如果您想要整行的显式匹配,也就是说,一个整数,一组科学数字,一个时间,然后是一个整数,您可以将它们捆绑在一起:

egrep '^[[:space:]]*[0-9]([[:space:]]+-?[0-9]+\.[0-9]+e[+-][0-9]+)+[[:space:]]+[0-9]+(:[0-9]{2}){2} [0-9]+$'

请注意,我使用显式类名和ERE,而不是快捷方式和PREG来维护与非Linux环境的兼容性。

鉴于问题中的文本是我们唯一需要继续讨论的内容,我看到了一些可以用来提取最后四行的模式

以下匹配第一个字段为数字且不包含逗号的行:

egrep '^[[:space:]]*[0-9][^,]+$'
这一行与科学记数法中包含数字的行相匹配:

grep '[0-9]e[+-][0-9]'
这一行与包含时间的行相匹配,该时间在行尾后跟一个整数:

egrep '[0-9]+(:[0-9]{2}){2} [0-9]+$'
或者,如果您想要整行的显式匹配,也就是说,一个整数,一组科学数字,一个时间,然后是一个整数,您可以将它们捆绑在一起:

egrep '^[[:space:]]*[0-9]([[:space:]]+-?[0-9]+\.[0-9]+e[+-][0-9]+)+[[:space:]]+[0-9]+(:[0-9]{2}){2} [0-9]+$'

请注意,我使用显式类名和ERE而不是快捷方式和PREG来维护与非Linux环境的兼容性。

不太清楚,请清楚地发布示例以及您为解决自己的问题所付出的努力。@RavinderSingh13 OP提供了他们的尝试;它是
grep-P'^\s*\d+'文件
,很难看到,因为它是少数没有格式化为代码的东西之一……;-)@Yunnosch,是的,是的,但老实说样本仍然不清楚,至少对我来说不清楚。还有,你的原始数据是什么样的?Awk可能是您唯一的过滤工具,无需任何管道。也许grep也可以,但我们需要看看起点。@Bineet,我们不需要整个文件,但也许您可以从中构造一个样本,长度不超过您当前的输入数据,其中包含您想要拒绝和包含的模式示例。你向我们展示的不是问题,而是你在试图解决问题过程中所取得的进展。这有点让这成为一个问题。不太清楚,请清楚地发布示例以及您为解决自己的问题所付出的努力。@RavinderSingh13 OP提供了他们的尝试;它是
grep-P'^\s*\d+'文件
,很难看到,因为它是少数没有格式化为代码的东西之一……;-)@Yunnosch,是的,是的,但老实说样本仍然不清楚,至少对我来说不清楚。还有,你的原始数据是什么样的?Awk可能是您唯一的过滤工具,无需任何管道。也许grep也可以,但我们需要看看起点。@Bineet,我们不需要整个文件,但也许您可以从中构造一个样本,长度不超过您当前的输入数据,其中包含您想要拒绝和包含的模式示例。你向我们展示的不是问题,而是你在试图解决问题过程中所取得的进展。这有点像是一种很好的横向思考。但是OP可能意味着“以空格和整数值开头的行”(我认为这是因为否则整个grep的使用似乎是无用的)。你的回答将有助于激起一个关于它的声明——或者已经是他们想要的了。两种方法都很好。:-)横向思维很好。但是OP可能意味着“以空格和整数值开头的行”(我认为这是因为否则整个grep的使用似乎是无用的)。你的回答将有助于激起一个关于它的声明——或者已经是他们想要的了。这两种方法都很好。您的解决方案“egrep'[0-9]+(:[0-9]{2}){2}[0-9]+$”运行得非常好,