gpt4 book ai didi

bash - 使用 awk 查找每个 block 的列中的最小值

转载 作者:行者123 更新时间:2023-11-29 09:42:15 24 4
gpt4 key购买 nike

我想为每个具有“@ value1 value2”格式的“标题行”的 block 找到列 $3 的最小值。文件看起来像这样

@ 62.65 -50.35
0 1.50 1.676
1.67 1.50 1.677
1.67 2.25 1.423
2.90 2.25 2.902
2.90 4.95 2.903
3.04 4.95 3.049
@ 63.61 -50.45
0 1.50 1.654
3.42 1.50 1.875
3.43 2.19 3.430
5.31 2.19 1.032
5.32 6.23 5.320
5.43 6.23 5.434

在此之后,我想打印标题以及具有最小 3 美元的整行。

所以,我的输出文件应该如下所示

@ 62.65 -50.35
1.67 2.25 1.423
@ 63.61 -50.45
5.31 2.19 1.032

这是我到目前为止尝试过的:

awk '{if (!/^@/) {if ($3 < min) {$3=min;} print $1, $2, $3, min; min = $3;} else if (/^@/) min = 10; print $1 $2 $3;}' input.txt > output.txt

我在分离 block 和“重置”分钟时遇到了麻烦(我尝试将“开始”值设置得较高 - 即 10)。

我是编程新手,到目前为止主要使用 awk - 如果你能帮助我,那就太好了!非常感谢!干杯,伊西

最佳答案

使用awk:

awk '/^@/{if(h){print h RS m}min=""; h=$0; next}min=="" || $3 < min{min=$3; m=$0}END{print h RS m}' infile

使用数组

awk '/^@/{h=$0;min="";next}min==""||$3<min{min=$3;l[h]=$0}END{for(i in l)print i RS l[i]}' infile

更好的可读性:

awk '/^@/{
if(h){
print h RS m
}
min=""; h=$0; next
}
min=="" || $3 < min{
min=$3;
m=$0
}
END{
print h RS m
}
' infile

使用数组

awk '/^@/{
h=$0;min="";
next
}
min==""||$3<min{
min=$3;
l[h]=$0
}
END{
for(i in l)
print i RS l[i]
}
' infile

测试结果:

$ cat infile
@ 62.65 -50.35
0 1.50 1.676
1.67 1.50 1.677
1.67 2.25 1.423
2.90 2.25 2.902
2.90 4.95 2.903
3.04 4.95 3.049
@ 63.61 -50.45
0 1.50 1.654
3.42 1.50 1.875
3.43 2.19 3.430
5.31 2.19 1.032
5.32 6.23 5.320
5.43 6.23 5.434

输出 1(推荐)

$ awk '/^@/{if(h){print h RS m}min=""; h=$0; next}min=="" || $3 < min{min=$3; m=$0}END{print h RS m}' infile
@ 62.65 -50.35
1.67 2.25 1.423
@ 63.61 -50.45
5.31 2.19 1.032

输出-2

$ awk '/^@/{h=$0;min="";next}min==""||$3<min{min=$3;l[h]=$0}END{for(i in l)print i RS l[i]}' infile
@ 62.65 -50.35
1.67 2.25 1.423
@ 63.61 -50.45
5.31 2.19 1.032

关于bash - 使用 awk 查找每个 block 的列中的最小值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46924474/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com