Накопительное индивидуальное использование awk - PullRequest
2 голосов
/ 06 января 2020

У меня есть следующий файл данных, где значения накапливаются в некоторой точке (до строки1> строки2):

ifile.txt
6
7
10
34
-999
-999
0
2
4
8
12
12
-999
-999
-999
-999
12
13
15

Я хотел бы распечатать все отдельные значения без учета неопределенных значений (то есть -999) .

Вывод моего желания:

ofile.txt
6
1
3
24
-999
-999
0
2
2
4
4
0
-999
-999
-999
-999
12
1
2

Я пытаюсь с awk'{(if $1 != -999 && [$1] >= [$2]),printf "%s\n",$1-$2}' ifile.txt

Ответы [ 3 ]

3 голосов
/ 06 января 2020

Вот еще одна идея awk:

$ awk '($1==-999){p=0; print; next}{print $1-p;p=$1}' file

Идея состоит в том, чтобы отслеживать совокупное значение предыдущей строки с помощью переменной p. Каждый раз, когда мы достигаем значения -999, мы сбрасываем p в ноль. Значение p не нужно инициализировать, поскольку awk предполагает, что все неинициализированные переменные по умолчанию являются пустой строкой и значением 0.

2 голосов
/ 06 января 2020

Вы можете использовать этот гораздо более простой awk:

awk '{print ($1>=p ? $1-p : $1)} {p = ($1==-999 ? 0 : $1)}' file

6
1
3
24
-999
-999
0
2
2
4
4
0
-999
-999
-999
-999
12
1
2
1 голос
/ 06 января 2020

В awk $ 1, $ 2, ... представляют разные столбцы, а не разные строки.

Попробуйте использовать дополнительную переменную p для отслеживания предыдущего значения с целью обращения кумулятивных значений

awk '
    # Save Original Values
{ pp=$1 }
    # Reverse cumulative values
$1 != -999 && p != "" && p != -999 && $1 >= p { $1 = $1 - p }
    # Print value, save for next line
{ print $1 ; p=pp}
' ifile.txt  > ofile.txt

Одна строка:

awk '{ pp=$1 } $1 != -999 && p != "" && p != -999 && $1 >= p { $1 = $1 - p } {  print $1 ; p=pp}' ifile.txt  > ofile.txt
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...