【问题标题】:Count how many repeated times each record appears and select minimum and maximum of specific column计算每条记录出现的重复次数并选择特定列的最小值和最大值
【发布时间】:2019-04-19 22:19:15
【问题描述】:

1 .- 拳头我想计算每条记录出现的次数,键是 substr($0,20,18),总是打印每条重复记录的最后一行并打印在最后一列的输出文件

2.- 找出第 7 列的最小值和最大值,并在输出文件的第 4 列和第 5 列中打印。

Input file

M              G   36829.00  37145.00     1  2161  36840.00  37146.00  37576
M              G   36829.00  37145.00   217  4321  36852.00  37146.00  37576
M              G   36829.00  37145.00   433  6481  36864.00  37146.00  37576
M              G   36829.00  37145.00   649  8641  36876.00  37146.00  37576
M              G   36829.00  37145.00   865 10801  36888.00  37146.00  37576              
M              G   36833.00  38033.00     1  4321  36840.00  37602.00  38464
M              G   36833.00  38033.00   433  8641  36852.00  37602.00  38464
M              G   36833.00  38033.00   865 12961  36864.00  37602.00  38464
M              G   36833.00  38033.00  1297 17281  36876.00  37602.00  38464
M              G   36833.00  38033.00  1729 21601  36888.00  37602.00  38464              
M              G   37265.00  38105.00     1  4321  36840.00  37674.00  38536
M              G   37265.00  38105.00   433  8641  36852.00  37674.00  38536
M              G   37265.00  38105.00   865 12961  36864.00  37674.00  38536
M              G   37265.00  38105.00  1297 17281  36876.00  37674.00  38536
M              G   37265.00  38105.00  1729 21601  36888.00  37674.00  38536
M              G   37265.00  38105.00  2161 25921  36900.00  37674.00  38536             
M              G   37271.00  38885.00     1  2211  36840.00  38454.00  38894
M              G   37271.00  38885.00   222  4421  36852.00  38454.00  38894
M              G   37271.00  38885.00   443  6631  36864.00  38454.00  38894
M              G   37271.00  38885.00   664  8841  36876.00  38454.00  38894

Desired Output file

36829.00  37145.00  10801  36840.00 36888.00  37146.00  37576 5 
36833.00  38033.00  21601  36840.00 36888.00  37602.00  38464 5 
37265.00  38105.00  25921  36840.00 36900.00  37674.00  38536 6 
37271.00  38885.00   8841  36840.00 36876.00  38454.00  38894 4 

I tried.

计算每条记录出现的次数。

awk '{dups[substr($0,20,18)]++} END{for (num in dups) {print num,dups[num]}}' file

在第 7 列中找到最小值和最大值。

awk '{\
      l = substr($7,1,5);\
      printf ("%5d  \n",l);\
     }' file  |

awk     '               {D1=substr($1, 1, 5)
                         D2=substr($1, 1, 5)+0
                        }
         !(D1 in MIN)   {MIN[D1]=D2
                         MAX[D1]=D2
                         next
                        }
          D2 < MIN[D1]  {MIN[D1]=D2}
          D2 > MAX[D1]  {MAX[D1]=D2}
          END           {for (m in MIN) print m, MIN[m], MAX[m]}

提前致谢。

【问题讨论】:

    标签: awk


    【解决方案1】:

    听起来这就是你想要做的:

    $ cat tst.awk
    { currKey = $3 FS $4 }
    currKey != prevKey { prt(); min=$7; cnt=0 }
    { prevRec=$0; prevKey=currKey; max=$7; cnt++ }
    END { prt() }
    
    function prt(   f) {
        if ( cnt ) {
            split(prevRec,f)
            print f[3], f[4], f[6], min, max, f[7], f[8], cnt
        }
    }
    
    $ sort -k3,4n -k7n file | awk -f tst.awk | column -t
    36829.00  37145.00  10801  36840.00  36888.00  36888.00  37146.00  5
    36833.00  38033.00  21601  36840.00  36888.00  36888.00  37602.00  5
    37265.00  38105.00  25921  36840.00  36900.00  36900.00  37674.00  6
    37271.00  38885.00  8841   36840.00  36876.00  36876.00  38454.00  4
    

    【讨论】:

    • 先生。 Ed,我不明白你是如何定义 E.g. f[7] 打印第 7 列的值而不是 $7,我可以使用每个示例 [substr $7,1] 而不是 f[7]..顺便说一句,我将 f[7],f[8] 更改为 f[ 8],f[9] 以获得所需的输出。非常感谢您的帮助
    • @EdMorton 非常聪明的观察和解决方案。你的想法像你的代码吗? ;-)
    • 你能解释一下为什么 prt(f) 而不是 prt() 吗?正如预期的那样,两者都给了我相同的输出。
    • @acs005 对于您的第一个问题:谢谢,是的 - 非常简单:-)。对于你的第二个:我使用prt( f) 在函数prt() 内创建一个名为f 的局部变量(请参阅gnu.org/software/gawk/manual/html_node/Variable-Scope.html),在这种情况下这不是绝对必要的,但养成随时都做的习惯很好适当的,这样你就不会在必要时被咬。
    • @EdMorton,感谢所有的解释,非常感谢
    【解决方案2】:

    不保持输入文件的顺序,但即使你的文件不是按键排序的,也可以工作

    awk '
    {
        $7+=0;
        COUNT[$9]+=1;
        C1[$9]=$3;
        C2[$9]=$4;
        C3[$9]=$6;
        C6[$9]=$8
    }
    !($9 in MIN){
        MIN[$9]=$7; 
        MAX[$9]=$7; 
        next
    }
    $7<MIN[$9]{
        MIN[$9]=$7
    }
    $7>MAX[$9]{
        MAX[$9]=$7
    }
    END{
        for(id in COUNT){
            print C1[id], C2[id], C3[id], MIN[id], MAX[id], C6[id], id, COUNT[id]
        }
    }' <file>
    

    输出:

    37271.00 38885.00 8841 36840 36876 38454.00 38894 4
    36833.00 38033.00 21601 36840 36888 37602.00 38464 5
    36829.00 37145.00 10801 36840 36888 37146.00 37576 5
    37265.00 38105.00 25921 36840 36900 37674.00 38536 6
    

    【讨论】:

      【解决方案3】:

      请您尝试关注一下。

      awk '
      {
        val=substr($0,20,18)
        $1=$2=""
        sub(/^[[:space:]]+/,"")
      }
      prev!=val && prev{
        print first,second,min,max,third,count
        count=""
      }
      {
        min=min<$5?min?min:$5:$5
        max=max>$5?max:$5
        prev=val
        count++
        first=$1 OFS $2
        second=$4
        third=$(NF-1) OFS $NF
      }
      END{
        if(prev){
          print first,second,min,max,third,count
        }
      }
      '  Input_file | column -t
      

      【讨论】:

      • RavinderSingh13 先生,感谢代码运行良好,感谢您的帮助
      猜你喜欢
      • 1970-01-01
      • 2020-05-16
      • 2021-04-02
      • 2021-06-03
      • 2020-12-23
      • 1970-01-01
      • 2016-09-01
      • 1970-01-01
      • 2019-09-29
      相关资源
      最近更新 更多