我有以下数据文件,其中的值累加到某个点(直到第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
在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
这里是另一个awk想法:
$ awk '($1==-999){p=0; print; next}{print $1-p;p=$1}' file
想法是使用变量p
跟踪前一行的累积值。每次我们击中-999
值时,我们都会将p
重置为零。 p
的值不需要初始化,因为awk假定所有未初始化的变量默认都是空字符串和值0。
您可以使用这个简单得多的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