当第二列和第三列与数字模式匹配时打印整行

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了当第二列和第三列与数字模式匹配时打印整行相关的知识,希望对你有一定的参考价值。

当CSV的第2列和第3列匹配两个浮点值(即36.*,-125.*)时,我需要打印整行。

样本CSV(col2):

54.43,36.01,-125.54
60.32,45.32,-86.21
32.67,20.55,-30.78
76.56,36.78,-125.98

试图代码:

cat col2 | awk -F',' '{print $2,$3}' |  grep -E '36.*,-125.*'

预期结果:

54,36.01,-125.54
76,36.78,-125.98
答案

我会用这种方式而不是正则表达式匹配:

awk -F',' '$2>=36 && $2<37 && $3>-126 && $3<=-125' file

有了这条线,你不必关心$2是否有dot,例如,36 or 36.01

你给了你的代码:36.*,从那里我认为36也应该输出。

IMO,对于这种工作,算术比较总是超过正则表达式,即使有时正则表达式匹配也能完成这项工作。

另一答案

您可以简单地使用Awk如下(GNU Awk变体)

awk -vFS=, -vOFS=, '$2 ~ /^36./ && $3 ~ /^[-]125./' file

部分-vFS=, -vOFS=,为输入和输出限制器设置为,,它允许您解析从$1$NF的各个列。正则表达式匹配条件$2 ~ /^36./匹配以36.开头的记录,类似地,$3匹配-和括号表达式[-](可选,可以在没有它的情况下使用$3 ~ /^-125./)来标记以-125.字符串开头。

符合POSIX标准的版本可以用-vFS=,之后的空格写成-v FS=,或者将它们放在BEGIN子句中

awk 'BEGIN{FS=OFS=","} $2 ~ /^36./ && $3 ~ /^[-]125./' file
另一答案

你可以尝试这个sed

sed -E 'h;s/[^,]*,(36).[^,]*,(-125)..*$/12/;tA;d;:A;x' infile
另一答案
grep -E "^[^,]*,36.[0-9]*,-125.[0-9]*" col2

以上是关于当第二列和第三列与数字模式匹配时打印整行的主要内容,如果未能解决你的问题,请参考以下文章

第三列单元格应该是excel第一列和第二列中两个数字的乘积

怎样在一条sql语句中将第一列和第二列加和的值作为第三列的值

请问matlab如何从excel表格中读取数据,谢谢

具有堆叠图像的引导列:需要具有相同的列高

【小工具】python 携手R 计算两组数据相关性

matlab中如何向矩阵中添加元素