一只蝶 發表於 2023-5-21 00:00:00

awk分组求和分组统计次数

<h3><strong>分组求和</strong></h3>
<p></p><pre class="brush:bash;toolbar:false">awk '{s[$1] += $2}END{ for(i in s){print i, s } }' file1 &gt; file2</pre><p>以第一列 为变量名  第一列为变量,将相同第一列的第二列数据进行累加打印出和.</p>
<p><img src="https://zhuji.jb51.net/uploads/img/20230517/a1e3de0c87bea4d1c20b267eae7e1505.jpg" width="645" height="145"></p><pre class="brush:bash;toolbar:false">awk '{s[$1" "$2] += $3}END{ for(i in s){print i, s } }'file1 &gt; file2</pre><p>以第一列和第二列为变量名, 将相同第一列、第二列的第三列数据进行累加打印出和</p>
<p><img src="https://zhuji.jb51.net/uploads/img/20230517/cefbda5e4b47798a351351256b9a7195.jpg" width="576" height="139"></p><pre class="brush:bash;toolbar:false">awk '{s[$1] += $2; a[$1] += $3 }END{ for(i in s){  print i,s,a } }'  haha.txt</pre><p>如果第一列相同,则根据第一列来分组,分别打印第二列和第三列的和</p>
<p><img src="https://zhuji.jb51.net/uploads/img/20230517/4252b28e4444dbff0dd39e981d2f6d2c.jpg" width="602" height="112"></p>
<h3><strong>匹配</strong></h3>
<p>1、匹配交集项</p><pre class="brush:bash;toolbar:false">awk 'NR==FNR{a[$1]=1}NR&gt;FNR&amp;&amp;a[$1]&gt;0{print $0}'  file1(字段:QQ) file2(字段:QQ 点券值 ) &gt; file3</pre><p>如果file1、file2中,2个文件的第一列值相同,输出第2个文件的所有列</p>
<p>注意:数据量如果达到4Gb以上或者行数达到一亿级别,建议将file2进行split分割,否则就算是32G的内存的机器都会被吃掉;</p>
<p><img src="https://zhuji.jb51.net/uploads/img/20230517/27540a8af2c18814be2631a64d4e0975.jpg" width="576" height="224"></p><pre class="brush:bash;toolbar:false"> awk 'NR==FNR{a[$1" "$2]=1}NR&gt;FNR&amp;&amp;a[$1" "$2]&gt;0{print $0}'  file1 file2&gt; file3</pre><p>如果file1、file2中,2个文件的第一列第二列值相同,输出第2个文件的所有列</p>
<p><img src="https://zhuji.jb51.net/uploads/img/20230517/de8c74a2cdc5ddbde932e07f8c3bd4d4.jpg" width="576" height="173"></p>
<p>2、匹配非交集项</p><pre class="brush:bash;toolbar:false">  awk 'NR==FNR{a[$1]=1}NR&gt;FNR&amp;&amp;a[$1]&lt;1 {print $0}'  file1 file2 &gt; file3</pre><p>针对2个文件的第一列做比较,输出:在file2中去除file1中第一列出现过的行</p>
<p><img src="https://zhuji.jb51.net/uploads/img/20230517/b9152cd8f7935e7d34b5e4ef880d80c8.jpg" width="576" height="175"></p>
<p>第二种方法:</p><pre class="brush:bash;toolbar:false">cat file1 file2|sort |uniq -d &gt; jiaoji.txt
cat file2 jiaoji.txt  |sort |uniq -u &gt; file3</pre><p></p>
<h3><strong>取最大值、最小值</strong></h3>
<p>1、针对(2列的文件)</p><pre class="brush:bash;toolbar:false">awk '{max[$1]=max[$1]&gt;$2?max[$1]:$2}END{for(i in max)print i,max}'  file</pre><p>第一列不变,取第二列分组最大值</p><pre class="brush:bash;toolbar:false">awk '{if(!min[$1])min[$1]=20121231235959;min[$1]=min[$1]&lt;$2?min[$1]:$2}END{for(i in min)print i,min}' file</pre><p>第一列不变,取第二列分组最小值</p>
<p>2、针对单列的文件</p><pre class="brush:bash;toolbar:false">awk 'BEGIN {max = 0} {if ($1&gt;max) max=$1 fi} END {print "Max=", max}' file2
awk 'BEGIN {min = 1999999} {if ($1&lt;min) min=$1 fi} END {print "Min=", min}' file2</pre><p></p>
<h3><strong>求和、求平均值、求标准偏差</strong></h3>
<p>求和</p><pre class="brush:bash;toolbar:false">cat data|awk '{sum+=$1} END {print "Sum = ", sum}'</pre><p>求平均</p><pre class="brush:bash;toolbar:false">cat data|awk '{sum+=$1} END {print "Average = ", sum/NR}'</pre><p>求标准偏差</p><pre class="brush:bash;toolbar:false">cat $FILE | awk -v ave=$ave '{sum+=($1-ave)^2}END{print sqrt(sum/(NR-1))}'</pre><p></p>
<h3><strong>整合行和列</strong></h3>
<p><strong>1、列换成行</strong></p>
<p>如果第一列相同,将所有的第二列 第三列 都放到一行里面</p><pre class="brush:bash;toolbar:false"> awk '{qq[$1]=qq[$1](" "$2" "$3)}END{for(i in qq)print i,qq}'</pre><p><img src="https://zhuji.jb51.net/uploads/img/20230517/1498a7000d72fb533e16264107bfb573.jpg" width="597" height="105"></p>
<p><strong>2、合并文件</strong></p>
<p>2个文件,每个2列,将他们按照第一列相同的数,来合并成一个三列的文件,同时,将每个文件中针对第一列对应第二列中没有的数补0</p><pre class="brush:bash;toolbar:false">awk 'FNR==NR{a[$1]=$2}FNR&lt;NR{a[$1]?a[$1]=a[$1]" "$2:a[$1]=a[$1]" 0 "$2}END{for(i in a)print i,a}' file1 file2 &gt; file3</pre><p>注意点:文件2 一定要比文件1 的行数小</p>
<p>3、2个文件,每个3列,将他们按照第一列、第二列相同的数,来合并成一个4列的文件,同时,将每个文件中针对第一列、第二列对应第3列中没有的数补0</p><pre class="brush:bash;toolbar:false">awk 'FNR==NR{a[$1" "$2]=$3}FNR&lt;NR{a[$1" "$2]?a[$1" "$2]=a[$1" "$2]" "$3:a[$1" "$2]=a[$1" "$2]" 0 "$3}END{for(i in a)print i,a}'  file</pre><p>4、将列换成行,遇到空行,另起下一行</p><pre class="brush:bash;toolbar:false">awk 'begin {RS=""} {print $1,$2,$3} file1</pre><p>5、某列数字范围筛选</p><pre class="brush:bash;toolbar:false">cat   canshu |while read a b
do
awk '{ if ($2&gt;'"$a"' &amp;&amp; $2&lt;='"$b"' ) print $1}' result.txt  &gt; "$a"_"$b"_result.log
done</pre><p><strong>注意点:awk使用函数时,使用'"$a"'(先单引号,后双引号)</strong></p>
<h3><strong>集合类</strong></h3>
<p><img src="https://zhuji.jb51.net/uploads/img/20230517/08dd49dfe73e567c7eb4e51022f5e685.jpg" width="479" height="94"></p>
<p>1、集合交</p><pre class="brush:bash;toolbar:false">cat fileA fileB |sort |uniq –d &gt; result.log</pre><p>2、集合差</p><pre class="brush:bash;toolbar:false">cat fileA fileB     |sort |uniq -d   &gt; jiaoji.txt
cat fileA jiaoji.txt  |sort |uniq -u   &gt; result.log</pre><p>3、集合全集去重</p><pre class="brush:bash;toolbar:false">cat fileA fileB |sort  -u &gt; result.log</pre><p>4、集合全集不去重</p><pre class="brush:bash;toolbar:false">cat fileA fileB |sort     &gt; result.log</pre><p></p>
頁: [1]
查看完整版本: awk分组求和分组统计次数