累积使用awk的个人

问题描述 投票:2回答:3

我有以下数据文件,其中的值累加到某个点(直到第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

shell awk
3个回答
1
投票

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

2
投票

这里是另一个awk想法:

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

想法是使用变量p跟踪前一行的累积值。每次我们击中-999值时,我们都会将p重置为零。 p的值不需要初始化,因为awk假定所有未初始化的变量默认都是空字符串值0。


1
投票

您可以使用这个简单得多的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
© www.soinside.com 2019 - 2024. All rights reserved.