计算每条记录出现的重复次数,并选择特定列的最小值和最大值

时间:2019-04-19 10:17:38

标签: awk

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]}

谢谢。

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:3)

听起来这是您要执行的操作:

$ 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

答案 2 :(得分:1)

不保留输入文件的顺序,但是即使您没有先按键对文件进行排序,也可以使用

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