参考文章1http://blog.chinaunix.net/uid-23302288-id-3785105.html
参考文章2https://www.runoob.com/linux/linux-comm-awk.html
参考文章3https://blog.csdn.net/start_2013/article/details/109516934
awk
用来处理文本,按行读取进行处理
一、指定分隔符分割文本
log.txt中的文本内容
2 this is a test
3 Do you like awk
This's a test
10 There are orange,apple,mongo
命令格式
awk -F
格式 awk -F[分隔符] '{动作}' 文件名
- 不指定分隔符的类型,默认是空格或者tab
$0
: 每行的所有字符串
$1
: 每行切分后的第1个字符串
$2
: 每行切分后的第2个字符串
awk '{print $1,$2}' log.txt
没有指定分隔符,使用空格或者tab,将每行的文本内容分开,打印每行、经过切分后的第一个和第二个字符串
输出
awk -F, '{print $1,$2}' log.txt
- 使用单个分隔符
,
对文本进行切分,由于每行都没有,
,原样输出文本内容
- 使用多个分隔符
空格和,
对文本进行切分
awk -F'[ ,]' '{print $1,$2}' log.txt
用两个分隔符-F '/|.json'
.这里的分隔符是/
和json
,两者用|
分开
二、按条件过滤文本
- 过滤第一列大于2的行
awk '$1>2' log.txt #命令
- 过滤第一列大于2的行,输出该行的前两个字符串
awk '$1>2 {print $1,$2}' log.txt
- 同时满足两个条件。过滤第一列大于2并且第二列等于
Do
的行
awk '$1>2 && $2=="D" {print $1,$2,$3}' log.txt
- 按列数和行数处理
三、在行首/行尾添加文本
摘自https://blog.csdn.net/start_2013/article/details/109516934
在前面、后面、指定列添加相同字符
(1)给一个文件中的每一行开头插入字符的方法:awk '{print "需要添加的字符" $0}' fileName
(2)给一个文件中的每一行结尾插入字符的方法:awk '{print $0 "需要添加的字符" }' fileName
(3) 在指定列前添加字符
awk.txt的文本信息如下
- 在第一列前加"1start",在第一列后添加"1end",在第2列前加"2start",在第一列后添加"2end"
- 语句
awk '{print "1start " $1 " 1end", "2start " $1 " 2end"}' awk.txt
四、设置变量
参考https://www.runoob.com/linux/linux-comm-awk.html
awk -v src_img_dir_name='abc' -F '/|.json' '$11 >0.85 {print "../x3_person/images_org/"src_img_dir_name"/"$10 ".json"}' ${txt_path}.
用/
和json
划分txt_path
文件中每一行的内容,然后将每行中第11个元素的值大于0.85的,输出../x3_person/images_org/"src_img_dir_name"/"$10
,src_img_dir_name
是在awk中设置变量名
txt_path文档中,第一个数值大于person_num变量有多少行
group_num=$(awk -v person_num="${person_num}" '$1 > person_num' "${txt_path}" | wc -l)
五、应用实例
1. 统计yolo模型推理出的某个类别的目标数
find file_name -name "*.txt" | xargs awk -F '[ ]' '$1=cls {print $0}' | wc -l
例:find exp10_ep500_10326 -name "*.txt" | xargs awk -F '[ ]' '$1==0 {print $0}' | wc -l
- 先找出所有的推理结果文件(txt文件)
- 用awk处理每个文件(txt文件的格式如下,第一个值是类别),取类别为cls的目标的数量