【问题标题】:awk if-else and variable reassignmentawk if-else 和变量重新赋值
【发布时间】:2018-11-14 20:15:33
【问题描述】:

我有一个由 xyz 坐标组成的文本文件,每个坐标都定义了斜坡的特定深度轮廓。 所有这些行都存储在一个文件中,每个轮廓用“>”

分隔

文件如下:

 >
 x1  y1  z1
 x2  y2  z2
 >
 x3  y3  z3
     ...

该文件巨大且笨重,我想打印出沿每个轮廓的第 7 个点并将其通过管道传输到一个制表符分隔的新文件中。

我的代码如下所示:

awk -v OFS='\t' -v count=1 '{if ($1 == ">") {count/=count}; else if (count%7 == 0) {{count+=1} print $0}; else {count+=1}}' infile > outfile

我不断收到一条错误消息,上面写着

    awk: syntax error at source line 1
 context is
    {if ($1 == ">") {count/=count}; >>>  else <<<  if (count%7 == 0) {{count+=1}; print $0}; else {count+=1}}
awk: illegal statement at source line 1

我花了一段时间检查我的语法和括号,看起来没问题,我可能只是在变量重新分配时遗漏了一些东西?

【问题讨论】:

  • 去掉}else之间的; ,即。 if(1) something(); elseif(1) { some(); thing() } else 所以你基本上可以:if ($1 == "&gt;") count/=count; else if ($1 == "&gt;") {count/=count} else

标签: if-statement awk syntax


【解决方案1】:

你的语法非常接近;只是有点偏离。看起来花括号{ } 和普通括号之间可能存在一些混淆。随着您更多地使用 awk,差异应该会变得更加清晰。

在我解决您的特定语法问题之前,请注意,更简单的方法可以解决相同的问题:

awk -v OFS='\t' '$1 == ">" { count = 1; next } !(count++ % 7)' file

您更正的代码将是一个多行版本:

{
  if ($1 == ">") {
    count = 1
  }
  else
    if (count % 7 == 0) {
      count += 1
      print $0
    }
    else
      count += 1
}

只要语句单独一行,就不需要分号。但请注意,要使其成为单线,您需要如下所示的:

{ if ($1 == ">") { count = 1  } else if (count % 7 == 0) { count += 1; print $0 } else count += 1 }

【讨论】:

    猜你喜欢
    • 2012-12-12
    • 2015-11-09
    • 1970-01-01
    • 2019-03-06
    • 1970-01-01
    • 2012-10-03
    • 1970-01-01
    • 2020-10-29
    • 2017-02-25
    相关资源
    最近更新 更多