我有一个包含 30000 行的数据集。我想添加 0-50 范围内的所有相应值(即第 2 列),然后是 50.1-100,然后是 100.1-150 等(显示在第 1 列中),并且此顺序将继续执行中的其余行文件。
输入文件:
10 1
21.1 1
22 1
28 2
30 5
44.44 2
44.45 1
50 2
55 22
100.11 200
105 5
600.2 10
888 90
预期输出:
0 15
50 22
100 205
600 10
850 90
我试过
awk 'NR==1 {printf "%s\t",$1; N=$1+49}
$1>=N {printf "%s\n%s\t",sum,N; N+=49; sum=0}
{sum+=$2}
END {printf "%s\n", sum}
' myfile
但我没有得到预期的输出。
答案1
和awk:
$ awk '
{arr[int(($1%50?$1:($1-1))/50)]+=$2};
END{for(k in arr){print k*50, arr[k]}}
' file.txt | sort -k1,1n
例子
printf
您也可以使用inside控制输出的格式awk
。
$ awk '
{arr[int(($1%50?$1:($1-1))/50)]+=$2};
END{for(k in arr){printf "%-11s%-5s\n", k*50, arr[k]}}
' file.txt | sort -k1,1n
0 15
50 22
100 205
600 10
850 90
答案2
这应该可以做到:
sort -g file | awk 'BEGIN{N=50}{
if($1<=N){out[N-50]+=$2}
else{while($1>=N){N+=50;};
out[N-50]+=$2}
}END{for(i in out){print i,out[i]} }' | sort -g