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

问题描述 投票:1回答:4

当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
csv unix awk grep
4个回答
2
投票

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

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

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

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

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


2
投票

您可以简单地使用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

0
投票

你可以尝试这个sed

sed -E 'h;s/[^,]*,(36)\.[^,]*,(-125)\..*$/\1\2/;tA;d;:A;x' infile

0
投票
grep -E "^[^,]*,36.[0-9]*,-125.[0-9]*" col2
© www.soinside.com 2019 - 2024. All rights reserved.