shell - 使用 awk 查找区间中的最小值
问题描述
我想在每 5 行间隔中找到所有列的最小值。
例如输入文件
2 3 2
2 3 3
8 9 5
5 3 4
7 2 2
0 4 2
5 6 4
6 4 3
3 8 4
2 3 4
愿望输出
2 2 2
0 3 2
我的以下脚本在选择所有行时工作,例如 NR=10,但是当我选择 NR=5 时,它没有打印所需的输出。
awk '
{
for (i=1;i<=NF;i++) {
if (i in min) {
if ($i < min[i]) {
min[i]=$i;
count[i]++
}
} else {
min[i]=$i;
count[i]++
}}}
NR%5==0{
for (i in min) {
min1=count[i]?min[i]:0;
printf ("%10.3f ", min1)
}
printf ("\n");
}'
我无法理解错误在哪里。
解决方案
我相信您需要使旧变量值无效并删除数组的先前值,以便每次迭代都从 null 开始,并且不要使用最终会给出误报值的先前迭代值。在站点 https://ideone.com/u0hy15中对其进行了测试
awk '
{
for (i=1;i<=NF;i++) {
if (i in min) {
if ($i < min[i]) {
min[i]=$i;
count[i]++
}
} else {
min[i]=$i;
count[i]++
}}}
NR%5==0{
for (i in min) {
min1=count[i]?min[i]:0;
printf ("%10.3f ", min1)
}
printf ("\n");
min1=""
delete min
}' Input_file
我在 OP 的代码尝试中添加min1=""
和delete min
作为改进和修复。
推荐阅读
- php - Failed to load resource: PHP with jQuery callback
- java - 更改 Android Listview ArrayAdapter 中最后一项的布局
- xml - 根据 ss:Index 对单元格进行排序
- java - 如何从 java servlet 调用 html
- asp.net-core - 如何删除 ASP.NET Core 2.2 中的一些默认标识表
- java - Mock/JUnit ApplicationContext getBean 通过 ApplicationContextAware
- c - 当我只有一个 4 字节的局部变量时,为什么在这个反汇编中堆栈增长了 16 字节?
- neo4j - 通过 Windows 服务启动的 neo4j 数据库无法远程访问
- python - 如何将不小心写错的日期更改为以前的数字形式?
- tmpfs - tmpfs (linux/ubuntu) 在磁盘还是内存上?