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

Awk 计算每条记录出现的重复次数,并选择特定列的最小值和最大值,awk,Awk,1。-首先,我想计算每条记录出现的次数键为substr($0,20,18),每次重复打印每条记录的最后一行,并在最后一列的输出文件中打印 2。-在第7列找到最小值和最大值,并在输出文件的第4列和第5列中打印 输入文件 M G 36829.00 37145.00 1 2161 36840.00 37146.00 37576 M G 36829.00 37145.00 217 4321 36852.00 371

1。-首先,我想计算每条记录出现的次数键为substr($0,20,18),每次重复打印每条记录的最后一行,并在最后一列的输出文件中打印

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

输入文件

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
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 
所需的输出文件

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
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 
我试过了。

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
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 
计算每条记录出现的次数

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'{\
l=子项R($7,1,5)\
printf(“%5d\n”,l)\
}"档案"|
awk'{D1=substr($1,1,5)
D2=substr($1,1,5)+0
}
!(D1单位为MIN){MIN[D1]=D2
最大值[D1]=D2
下一个
}
D2MAX[D1]{MAX[D1]=D2}
结束{对于(最小值中的m)打印m,最小值[m],最大值[m]}

提前谢谢。

请尝试以下内容

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
awk'
{
val=substr($0,20,18)
$1=$2=""
子(/^[:空格:]+/,“”)
}
上一个=val&prev{
打印第一、第二、最小、最大、第三、计数
count=“”
}
{
最小值=最小值5美元?最大值:5美元
prev=val
计数++
第一个=2美元中的1美元
秒=4美元
第三个=$(NF-1)OFS$NF
}
结束{
如果(上一个){
打印第一、第二、最小、最大、第三、计数
}
}
'输入文件|列-t

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

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>

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

$ 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

RavinderSingh13先生,谢谢你的代码,它工作得很好,谢谢你的帮助。Ed,我不明白您是如何定义的,例如,f[7]打印第7列的值而不是$7,我可以使用每个示例[substr$7,1]而不是f[7]吗。。顺便说一句,我将f[7],f[8]更改为f[8],f[9]以获得所需的输出。非常感谢你的邀请help@EdMorton非常聪明的观察和解决方案。你认为你喜欢你的代码吗?;-)你能解释一下为什么prt(f)而不是prt()吗?这两个都给了我相同的输出,正如预期的那样。@acs005回答您的第一个问题:谢谢,是的-非常简单:-)。第二个例子:我使用
prt(f)
在函数
prt()
(请参阅)中创建一个名为
f
的局部变量,在这种情况下,这不是严格必要的,但是养成在适当的时候总是这样做的习惯是很好的,这样在必要的时候就不会被咬。@EdMorton,非常感谢所有的解释,谢谢