当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
答案 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标准的版本可以使用-v
和FS=,
之后的空格-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