下面的awk脚本是如何找出最小值的

sh/bash/dash/ksh/zsh等Shell脚本
回复
糊涂的小强
帖子: 71
注册时间: 2014-04-28 14:33
系统: ubuntu12&centos6

下面的awk脚本是如何找出最小值的

#1

帖子 糊涂的小强 » 2014-05-26 17:44

代码: 全选

awk '{if(!min[$1])min[$1]=20121231235959;min[$1]=min[$1]<$2?min[$1]:$2}END{for(i in min)print i,min[i]}'  src/file.txt> outputs/result.txt
头像
astolia
论坛版主
帖子: 6703
注册时间: 2008-09-18 13:11

Re: 下面的awk脚本是如何找出最小值的

#2

帖子 astolia » 2014-05-26 19:58

src/file.txt应该每一行都是

代码: 全选

n m
这样两个字段吧,然后找相同n中最小的m?

awk中的数据都是关联数组,这段代码就是关联数组的简单应用

稍微改写一下awk程序就是这样的

代码: 全选

{
    if(!min[$1]) {
       min[$1]=20121231235959;
    }
    if (min[$1] < $2) {
        min[$1] = $1
    } else {
        min[$1] = $2
    }
}
END{
   for(i in min) {
      print i,min[i]
   }
}

假设src/file.txt的内容如下
a 5
b 4
a 2
b 5

则awk中min数组的变化情况如下

代码: 全选

// 第一行
if(!"") {
   min["a"]=20121231235959;
}
if (20121231235959 < 5) {
} else {
    min["a"] = 5
}
// 第二行
if(!"") {
   min["b"]=20121231235959;
}
if (20121231235959 < 4) {
} else {
    min["b"] = 4
}
// 第三行
if(!5) {
}
if (5 < 2) {
} else {
    min["a"] = 2
}
// 第四行
if(!4) {
}
if (4 < 5) {
    min["b"] = 4
}
执行到END块时,
min["a"] = 2
min["b"] = 4
已经是相同n中最小的m,然后直接输出
糊涂的小强
帖子: 71
注册时间: 2014-04-28 14:33
系统: ubuntu12&centos6

Re: 下面的awk脚本是如何找出最小值的

#3

帖子 糊涂的小强 » 2014-05-27 9:50

astolia 写了:src/file.txt应该每一行都是

代码: 全选

n m
这样两个字段吧,然后找相同n中最小的m?

awk中的数据都是关联数组,这段代码就是关联数组的简单应用

稍微改写一下awk程序就是这样的

代码: 全选

{
    if(!min[$1]) {
       min[$1]=20121231235959;
    }
    if (min[$1] < $2) {
        min[$1] = $1
    } else {
        min[$1] = $2
    }
}
END{
   for(i in min) {
      print i,min[i]
   }
}

假设src/file.txt的内容如下
a 5
b 4
a 2
b 5

则awk中min数组的变化情况如下

代码: 全选

// 第一行
if(!"") {
   min["a"]=20121231235959;
}
if (20121231235959 < 5) {
} else {
    min["a"] = 5
}
// 第二行
if(!"") {
   min["b"]=20121231235959;
}
if (20121231235959 < 4) {
} else {
    min["b"] = 4
}
// 第三行
if(!5) {
}
if (5 < 2) {
} else {
    min["a"] = 2
}
// 第四行
if(!4) {
}
if (4 < 5) {
    min["b"] = 4
}
执行到END块时,
min["a"] = 2
min["b"] = 4
已经是相同n中最小的m,然后直接输出
嗯 谢谢,好久没接触C语言了,awk那种写法我都没印象了。
糊涂的小强
帖子: 71
注册时间: 2014-04-28 14:33
系统: ubuntu12&centos6

Re: 下面的awk脚本是如何找出最小值的

#4

帖子 糊涂的小强 » 2014-05-27 9:52

astolia 写了:src/file.txt应该每一行都是

代码: 全选

n m
这样两个字段吧,然后找相同n中最小的m?

awk中的数据都是关联数组,这段代码就是关联数组的简单应用

稍微改写一下awk程序就是这样的

代码: 全选

{
    if(!min[$1]) {
       min[$1]=20121231235959;
    }
    if (min[$1] < $2) {
        min[$1] = $1
    } else {
        min[$1] = $2
    }
}
END{
   for(i in min) {
      print i,min[i]
   }
}

假设src/file.txt的内容如下
a 5
b 4
a 2
b 5

则awk中min数组的变化情况如下

代码: 全选

// 第一行
if(!"") {
   min["a"]=20121231235959;
}
if (20121231235959 < 5) {
} else {
    min["a"] = 5
}
// 第二行
if(!"") {
   min["b"]=20121231235959;
}
if (20121231235959 < 4) {
} else {
    min["b"] = 4
}
// 第三行
if(!5) {
}
if (5 < 2) {
} else {
    min["a"] = 2
}
// 第四行
if(!4) {
}
if (4 < 5) {
    min["b"] = 4
}
执行到END块时,
min["a"] = 2
min["b"] = 4
已经是相同n中最小的m,然后直接输出
嗯 谢谢,好久没接触c语言了,awk那种书写方式我都没印象了。
糊涂的小强
帖子: 71
注册时间: 2014-04-28 14:33
系统: ubuntu12&centos6

Re: 下面的awk脚本是如何找出最小值的

#5

帖子 糊涂的小强 » 2014-05-27 9:52

回复 被河蟹了。。。。
头像
eexpress
帖子: 58428
注册时间: 2005-08-14 21:55
来自: 长沙

Re: 下面的awk脚本是如何找出最小值的

#6

帖子 eexpress » 2014-05-27 10:09

awk就是c的写法,加上一些特有的结构。
手动比较大小的方法,很初级。
试试高级的hash,保存进去就自动给你排序完了。
● 鸣学
糊涂的小强
帖子: 71
注册时间: 2014-04-28 14:33
系统: ubuntu12&centos6

Re: 下面的awk脚本是如何找出最小值的

#7

帖子 糊涂的小强 » 2014-05-27 11:53

eexpress 写了:awk就是c的写法,加上一些特有的结构。
手动比较大小的方法,很初级。
试试高级的hash,保存进去就自动给你排序完了。
hash也可以。。。。
回复