如何解决最大差异
该问题与我之前的问题有关:Maximum of the differences using shell script or awk
我有几个文件,每个文件都有两列,其中一些数据错误,例如负数很大。
file_1.txt
05Jan2020 3 4
06Jan2020 4 5
07Jan2020 2 4
08Jan2020 -10023 -9821
09Jan2020 4 7
10Jan2020 9 1
11Jan2020 3 5
12Jan2020 3 4
file_2.txt
05Jan2020 6 2
06Jan2020 4 5
07Jan2020 2 4
08Jan2020 -98323 -83432
09Jan2020 -208932 4
10Jan2020 7 17
11Jan2020 20 3
12Jan2020 20 2
file_3.txt
05Jan2020 4 4
06Jan2020 2 4
07Jan2020 2 4
08Jan2020 -129923 -1209923
09Jan2020 2 3
10Jan2020 12 3
11Jan2020 2 4
12Jan2020 7 1
我想在不考虑错误(大整数)数据的情况下,在上述文件中打印第2列和第3列之间的最大差异。
Print $1,[maximum($2-$3)<file*.txt]
所需的输出
ofile.txt
05Jan2020 4
06Jan2020 -1
07Jan2020 -2
08Jan2020 -99999
09Jan2020 -1
10Jan2020 9
11Jan2020 17
12Jan2020 18
我正在尝试以下脚本。它给出正确的结果,但是没有正确打印日期。它仅打印最后一个日期。
awk '$2 > -1000 && $3 > -1000 {
d = $2 - $3
if (FNR in diffs) {
if (diffs[FNR] < d)
diffs[FNR] = d
} else {
diffs[FNR] = d
}
}
END {
for (n = 1; n <= FNR; n++) {
if (n in diffs)
printf "%10s%10s\n",$1,diffs[n]
else
printf "%10s%10s\n","-99999"
}'file_*.txt
我得到以下结果:
12Jan2020 4
12Jan2020 -1
12Jan2020 -2
12Jan2020 -99999
12Jan2020 -1
12Jan2020 9
12Jan2020 17
12Jan2020 18
解决方法
请问您可以尝试以下内容吗?已经在移动设备上进行了编写,因此目前无法对其进行测试,但是应该可以。
awk '
{
diff=$2-$3
a[$1]=(a[$1]!="" && a[$1]>diff?a[$1]:diff)
}
END{
for(i in a){
print i,a[i]
}
}' *.txt
,
也将第一列保存在数组中。
在END
部分{dates[FNR] = $1}
之前插入,并将两个$1
都替换为dates[n]
。
您可以使用Perl,您可以在任何Linux发行版中找到它。
perl -e '
$bad = -99999;
while(<ARGV>){
chomp(@cols=split /\h+/);
$diff = $cols[1]<0 || $cols[2]<0 ? $bad : $cols[1]-$cols[2];
$old = $result{$cols[0]} || $bad;
$result{$cols[0]} = $old < $diff ? $diff : $old;
}
foreach $k (sort keys %result) {print "$k $result{$k}\n";}
' file*.txt
单行:
perl -e '$bad=-99999;while(<ARGV>){chomp(@c=split /\h+/);$diff=$c[1]<0||$c[2]<0?$bad:$c[1]-$c[2];$old=$result{$c[0]}||$bad;$result{$c[0]}=$old<$diff?$diff:$old;}foreach $k(sort keys %result){print "$k $result{$k}\n";}' file*
结果:
05Jan2020 4
06Jan2020 -1
07Jan2020 -2
08Jan2020 -99999
09Jan2020 -1
10Jan2020 9
11Jan2020 17
12Jan2020 18
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。