统计相关总结(AWK等)

概述

awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理

awk工作流程是这样的:读入有'\n'换行符分割的一条记录,然后将记录按指定的域分隔符划分域,填充域,$0则表示所有域,$1表示第一个域,$n表示第n个域。默认域分隔符是"空白键" 或 "[tab]键"。

awk -F'=' '$3>=100{print $3,NF,NR}' water_oa.log

1、基本用法:

Linux awk命令用法 - 骑白马的猴子 - 博客园

2、行求和、列求和:

linux 一行/一列数值累加求和_之芫的博客-CSDN博客_linux 求和

3、不同单位行的累加计算:

linux 累加程序语法,Linux之awk实现不同单位行的累加计算_牙膏从后挤啊的博客-CSDN博客

利用awk+三目运算实现不同单位的累加。有test.txt文档,数据如下。如何计算累计大小。

显然对于以下数据,由于单位不同直接累加数字肯定是不行的。

75955M
13232K
17492K
75953M
75963M
2G
10G
5T

直接抛awk语句,后面在针对性的进行分析:

#以G为单位统计数据
awk '{a+=/T/?$0*1024:(/M/?$0/1024:(/K/?$0/(1024^2):$0))}END{print a"G"}' test.txt 
5354.56G

#以T为单位统计数据
awk '{a+=/G/?$0/1024:(/M/?$0/(1024^2):(/K/?$0/(1024^3):$0))}END{print a"T"}' test.txt 
5.22906T

#以M为单位统计数据
awk '{a+=/T/?$0*(1024^2):(/G/?$0*1024:(/K/?$0/1024:$0))}END{print a"M"}' test.txt 
5.48307e+06M

命令解释:

#分析如下指令与
awk '{a+=/T/?$0*(1024^2):(/G/?$0*1024:(/K/?$0/1024:$0))}END{print a"M"}' test.txt 
5.48307e+06M

#主题指令
{a+=/T/?$0*(1024^2):(/G/?$0*1024:(/K/?$0/1024:$0))}END{print a"M"}

#进一步拆分
(/K/?$0/1024:$0):实现K单位到M单位的换算;即如果是K就除以1024
/G/?$0*1024:实现G单位到M单位的换算;即如果是G就乘1024
/T/?$0*(1024^2):实现T单位到M单位的换算;即如果是T就乘1024^2

4、从一个文件去掉包含在另一个文件的内容

Linux Shell从一个文件去掉包含在另一个文件的内容_weixin_33850890的博客-CSDN博客

如下file1.txt和file2.txt的内容分别如下。目标是移除file1.txt中所有在file2.txt中出现的内容,剩下作为最终输出结果。

file1.txt内容如下:
11
22
33
44
55
66
77
88
99

file2.txt内容如下:
1111
22
3333
4444
55
6666
7777
88
9999

很简单执行如下指令即可:

grep -v -f file2.txt file1.txt

分析:很简单-f就是从文件中读取匹配模板(pattern) ,此处即将file2.txt中的内容作为匹配数据源。那这些数据在file1.txt中匹配。-v选项表示 invert match即反向匹配,这里其实就是将没有在file2.txt中出现的输出出来。显然这就是我们想要的结果。

5、sed命令在文本的行首行尾添加特定字符串

https://www.cnblogs.com/klausage/p/14801866.html

原始文件 test.txt 内容如下: 

2852157000

2852165300

2852166000

2852165200

2852169300

2852169100

2852168300

2852190800

2885782500

2885852200

2885791300

(1)在test.txt文件每一行的行首添加字符,比如"HEAD":

sed 's/^/HEAD&/g' test.txt

sed 's/^/AAA/' test.txt

(2)在test.txt文件每一行的行尾添加字符,比如"TAIL":

sed 's/$/&TAIL/g' test.txt

sed 's/$/BBB/' test.txt

注:结果直接输出控制台,如果想输出文件就 > result.txt 即可。

(3)行尾追加" 1719503999 1",将结果输出到 targetkfuines.txt文档

sed 's/$/& 1719503999 1/g' test.txt > targetkfuines.txt

注:如果想要源文件上更改添加“-i”选项即可。

(4)可以把两条命令合并在一起。即对test.txt的每一行,行首和行尾分别添加字符“HEAD”、“TAIL”。

sed '/./{s/^/HEAD&/;s/$/&TAIL/}' test.txt

几点说明:

①"^"代表行首, "$"代表行尾

②s/$/&TAIL/g:中的字符g表示每行出现的字符都替换

6、去重  uniq

相邻行的去重直接如下即可。

uniq kfuinkfuse.txt > kfuinkfuseuniq.txt

7、文件打乱  shuf

[Linux] 随机切分文件内容

shuf:随机

有如下目标 文件test.txt。 想得到一个按照行打乱后的文件。

1111
2222
3333
4444
5555
6666
7777
8888
9999
0000

shuf  test.txt > result.txt

得到result.txt文件内容如下:

0000
1111
6666
3333
9999
7777
8888
2222
4444
5555

使用举例一:对于如下内容的test.txt文件

1、求各个文件累计大小(即第一个字段KB数累加)

     腾讯云cos文件信息列表
     169.8KB  Sun, 17 Jun 2018 06:18:27 GMT  pic/big/2852367983/db7125a7-2b14-485c-a1c8-fa455d490cde
      46.6KB  Sun, 08 Jul 2018 11:45:10 GMT  pic/big/2852367983/dd4ed4ed-2b4c-4860-acd5-186c13b18f8a
     132.0KB  Thu, 18 Apr 2019 12:24:24 GMT  pic/big/2852367983/dd65e583-dfbe-4f3d-aebd-c28e5e6e83c3
      37.2KB  Tue, 26 Feb 2019 11:19:33 GMT  pic/big/2852367983/dd9486d3-f1e7-4e0d-a071-048d341e1a3c
      59.7KB  Mon, 15 Apr 2019 02:41:53 GMT  pic/big/2852367983/ddd571ac-788e-480a-b2e8-79a2d9f4735b
      47.2KB  Mon, 20 Aug 2018 23:08:09 GMT  pic/big/2852367983/df450eb1-67ac-48de-9bfc-eeab1d255f08
     124.8KB  Thu, 30 Aug 2018 04:51:00 GMT  pic/big/2852367983/e065ec9d-954d-475b-abc7-d9932339d108
      59.2KB  Wed, 09 May 2018 03:45:40 GMT  pic/big/2852367983/e094a34e-0ce9-4f72-bd1b-ba8933165eda
      35.0KB  Sun, 13 Jan 2019 01:29:59 GMT  pic/big/2852367983/e0a76067-75ea-4876-8496-c7de4ed6e464
     437.3KB  Wed, 04 Jul 2018 04:17:32 GMT  pic/big/2852367983/e0a8ed47-3656-4e04-9c35-2c03b91e16c7
      82.5KB  Mon, 03 Sep 2018 00:43:28 GMT  pic/big/2852367983/e10cbb07-0884-4207-b9c6-66fad27c8faf
     121.4KB  Sat, 05 Jan 2019 11:46:28 GMT  pic/big/2852367983/e2a640b7-8e1f-40cc-86f8-f087ed4da9a2
      84.5KB  Mon, 11 Jun 2018 10:39:12 GMT  pic/big/2852367983/e2d5c1da-3b30-4469-bea1-e57b9b6893cc
       1.1KB  Fri, 11 May 2018 04:37:24 GMT  pic/big/2852367983/e3e667d1-5d71-447c-9d8e-8514ff8c771c
     507.4KB  Sun, 30 Sep 2018 00:19:17 GMT  pic/big/2852367983/e4c68ba8-03b7-4751-9097-1442e60aecf9

            —— create by shuozhuo

解决:

sed -n '2,16p' test.txt | awk -F "KB" '{sum+=$1}END{print sum}'

分析:
(1)sed -n '2,16p' test.txt
作用是取2,16行,其余摒弃
(2)awk -F "KB" '{sum+=$1}END{print sum}'
①-F "KB":表示以"KB"为分隔符进行切分
②$1:即以"KB"为分隔符分割后的第一个字段
③{sum+=$1}:为对KB前面的字段数值域进行累加
④END{print sum}:最后打印输出

使用举例二:对于如下数据实现第一列文件大小的累计统计

     390.1KB  Mon, 28 Feb 2022 09:20:09 GMT  pic/big/2880697568/1013380674-1174257073-62605CE6C317585CF9506A868408C765
       3.5MB  Sat, 09 Apr 2022 07:19:50 GMT  pic/big/2880697568/1013380674-172819393-3D38168268BCE487CA33777B703679C6
       2.9MB  Tue, 24 May 2022 03:17:24 GMT  pic/big/2880697568/1013380674-2452209874-54C6EB4F63F317DF00AB417FAD2FC98F
     388.7KB  Mon, 28 Feb 2022 09:19:33 GMT  pic/big/2880697568/1013380674-2547044193-5E13D9A0F522125717AC399868EA14B3
     411.8KB  Mon, 28 Feb 2022 09:19:13 GMT  pic/big/2880697568/1013380674-309506694-BCC9822074AA989F3A74109BC7F0EA38
       3.2MB  Sun, 22 May 2022 07:45:38 GMT  pic/big/2880697568/1013380674-3565614321-4E76EF48072E67874C0F13A67E038853
       3.4MB  Sat, 09 Apr 2022 07:19:48 GMT  pic/big/2880697568/1013380674-3734523448-9FD15BC52BECF28739B9CC0490A3ED53
     400.1KB  Mon, 28 Feb 2022 09:22:23 GMT  pic/big/2880697568/1013380674-988311880-AE13524823CFC5FE956958C2474CC5FB

指令及执行效果如下:

awk -F " " '{print $1}' big_list.txt | awk '{a+=/TB/?$0*(1024^2):(/GB/?$0*1024:(/KB/?$0/1024:$0))}END{print a"MB"}' big_list.txt

分析:

(1)首先将第一列数据摘取出来,得到如下数据.
awk -F " " '{print $1}' big_list.txt

390.1KB
3.5MB
2.9MB
388.7KB
411.8KB
3.2MB
3.4MB
400.1KB

(2)然后统一换算成以MB为单位的数据并累加计算
awk '{a+=/TB/?$0*(1024^2):(/GB/?$0*1024:(/KB/?$0/1024:$0))}END{print a"MB"}' big_list.txt

(3)整体执行效果如下
awk -F " " '{print $1}' big_list.txt | awk '{a+=/TB/?$0*(1024^2):(/GB/?$0*1024:(/KB/?$0/1024:$0))}END{print a"MB"}' big_list.txt
14.5534MB

猜你喜欢

转载自blog.csdn.net/mijichui2153/article/details/118344834
今日推荐