';grep';或';awk&x27;用于从文件中提取数字数据
我有一个包含字母数字数据的CFD输出文件。我的目标是提取某些具有数字数据的行,以便能够绘制。我能够使用grep提取以数值开头的数据。但是,这些提取数据的某些行以数字开头,但也包含我不想要的字母。这是一个样本';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
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]+$”运行得非常好,