当第二列和第三列与数字模式匹配时打印整行
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标准的版本可以用-v
和FS=,
之后的空格写成-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
以上是关于当第二列和第三列与数字模式匹配时打印整行的主要内容,如果未能解决你的问题,请参考以下文章