awk学习

-新创建个文件test

uid,phone,name
1,123,小明
2,234,小红
3,123,小小
4,123,dada
5,256,qwqw
6,234,erer
7,3432,zxzx
8,121,zzxzx
9,122,wq
  • 打印每一行
  • awk -F"," '{print $0}' test
  • 打印第一列
  • awk -F"," '{print $1}' test
  • 打印分别列加列名
    -awk -F"," '{print "uid:"$1"\tphone:"$2"\tname\t"$3 }' test
    -awk学习_第1张图片
  • 打印5-8行
  • awk -F"," '{if(NR<9&&NR>4) print$0}' test
    实例二:已知test.txt文件内容为:
[root@Gin scripts]# cat test.txt
I am Poe,my qq:is 33794712
  • 请从该文件中过滤出’Poe’字符串与33794712,最后输出的结果为:Poe 33794712(-F"“中是正则表达式,中括号中代表字符包含空格,”,","
  • awk -F"[ ,:]+" '{print $3"\t"$7}' t1.txt
  • Poe 33794712
  • 计算一共有多少列的计算过程
  • awk 'BEGIN{count=0;print "[start] begin uid count is "count}{count=count+1;print "现在是第",count,"行"}END{print "[end] end uid count is ",count}' test
  • awk学习_第2张图片
  • 计算文件总字节数
  • ll | awk 'BEGIN{size=0;print"开始计算size"}{size=size+$5}END{print "End size=",size,"字节"}'
  • 在这里插入图片描述
    -
  • 多空格符作为间隔的awk
  • awk -F[[:space:]+] '{print $1,$2,$3}' t1.txt
  • 疑问:下面的输出语句只有 123 为什么没有4,5 待研究
    -不研究了,是因为$4也是空格,中间三个空格不是按照一个分割符进行切割的
  • awk -F[[:space:]+] '{print $1,$2,$3,$4}' t1.txt
  • 打印test文件的第7行
  • awk -F"," 'NR==7{print $0}' test
变量名 属性
$0 当前行记录
$1~$N 对应行记录
FS 输入分隔符 默认是空格
RS 输入换行符
NF 记录有多少列
NR 已经读出的行数,就是行号
OFS 输出字段分隔符
ORS 输出字段的换行符
  • 修改test文件内容为
  • ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200514114214
  • List item

354.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjU5OTQyOQ==,size_16,color_FFFFFF,t_70)
-打印以\n为字段分隔符,空行为行换行符的awk

  • awk 'BEGIN {FS="\n";RS=""}{print $1,$2,$3}' test
  • 在这里插入图片描述
  • 选择带有"121"关键字符的行
  • awk '/121/ {print $0}' test
  • awk的替换操作(替换所有数字变成!)
  • awk 'BEGIN{info="this is replace 12test34";gsub(/[0-9]+/,"!",info);print info}'
  • 替换文件中所有的数字变成!感叹号
  • awk -F"," '{gsub(/[0-9]+/,"!");print $0}' test
  • 查找自定义字符串的数字是否存在(有数字输出为match_get,没有输出not found)
  • awk 'BEGIN{info="this is match123test!";print match(info,/[0-9]+/)?"match_get":"no found";}'
  • 找到每一行的正则匹配到的内容(匹配到两个逗号中间的内容)
  • awk '{match($0,/,(.*?),/,a);print a[1]}' test
  • 截取自定义变量的某区间字段,结果是1234
  • awk 'BEGIN{info="1234567";print substr(info,1,4)}'
  • 截取文件中分割的第二列的前两个字符
  • awk -F"," '{target=substr($2,1,2);print target}' test
  • split分割及循环输出所有的坐标及坐标对应的值
  • awk 'BEGIN{info="this is a test";split(info,tA," ");print length(tA);for(k in tA){print k,tA[k];}}
  • 读取test,并以“,”分割成数组,并打印数组的长
  • awk -F"," '{split($0,target,",");print length(target)}' test
  • 查询文件第二列含有某关键字段的信息
    -awk -F"\t" '$2 ~/ /{print $2}' error.txt|sort -u
  • 对文件第一行的每一个值打印对应坐标
  • head -1 test.txt |awk -F"," '{for(i=1;i<=NF;i++){print i,$i}}'
  • 对文件进行替换双引号操作
  • cat test.txt | awk -F"," '{print $7"\t"$8}'|sort -u|sed 's/\"//g'
  • 对文件进行某两列的去重
  • cat all_data.txt |awk -F "\t" '!a[$9""$10]++{print}' >ceshi2

你可能感兴趣的:(awk)