awk if-else и переназначение переменной - PullRequest
0 голосов
/ 14 ноября 2018

У меня есть текстовый файл, состоящий из координат 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

Я потратил некоторое время, проверяя мой синтаксис и брекетинг, и, кажется, все в порядке, я просто мог что-то упустить с переназначением переменной?

1 Ответ

0 голосов
/ 15 ноября 2018

Ваш синтаксис очень близок; только немного Похоже, что между фигурными скобками { } и обычными скобками может быть некоторая путаница. По мере того, как вы будете больше играть с 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 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...