【问题标题】:Print Entire Row When Second and Third Columns Match Numeric Pattern当第二列和第三列匹配数字模式时打印整行
【发布时间】:2017-12-23 06:39:42
【问题描述】:

当 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


    【解决方案1】:

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

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

    有了这一行,您就不必关心$2 是否带有dot,例如36 or 36.01

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

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

    【讨论】:

    • 短于int($2)==36 &amp;&amp; int($3)==-125
    【解决方案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
    

    【讨论】:

      【解决方案3】:

      你可以试试这个 sed

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

      【讨论】:

        【解决方案4】:
        grep -E "^[^,]*,36.[0-9]*,-125.[0-9]*" col2
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2018-04-04
          • 1970-01-01
          • 1970-01-01
          • 2013-02-23
          • 2015-11-04
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多