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]}
谢谢。
答案 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