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

时间:2017-12-22 15:40:44

标签: csv unix awk grep

当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

4 个答案:

答案 0 :(得分: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

答案 1 :(得分:2)

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

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

使用此行,您无需关心$2是否包含dot,例如36 or 36.01

您提供的代码如下:36.*,我认为36也应该在输出中。

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

答案 2 :(得分:0)

你可以试试这个sed

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

答案 3 :(得分:0)

grep -E "^[^,]*,36.[0-9]*,-125.[0-9]*" col2