awk扩展

  1. awk 中使用外部shell变量http://ask.apelearn.com/question/199

测试文件awk.txtlinux

及格:张三:67            
不及格:李四:58            
及格:小明:72            
优秀:小虎:95            
不及格:小兰:49
编写脚本awk1.sh:
#!/bin/bash
sort -n awk.txt|awk -F ":" '{print $1}'|uniq >考试.txt
sort awk.txt|awk -F ":" '{print $1}'|uniq -c >123.txt
for a in `cat 考试.txt`;do
        echo "[$a]":`awk -v c=$a   '$2==c {print $1}' 123.txt`人
        awk -v b=$a -F ":" '{OFS=":"} $1==b {print $2,$3}' awk.txt
done
[root@linux-128 test]# sh awk1.sh
[不及格]:2人
李四:58
小兰:49
[及格]:2人
张三:67
小明:72
[优秀]:1人
小虎:95
  • 注意:-v选项用于定义参数,这里表示将变量a的值赋予b
  • 有多少个变量须要赋值,就须要多少个-v选项。应用于脚本中:

  1. awk 合并一个文件 http://ask.apelearn.com/question/493 我有这样的需求,须要把两个文件中,第一列相同的行合并到同一行中。举个例子,有两个文件,内容以下
[root@linux-128 awk]#cat 1.txt    
1 aa
2 bb
3 ee
4 ss

[root@linux-128 awk]#cat 2.txt
1 ab
2 cd
3 ad
4 bd
5 de
[root@linux-128 awk]# awk 'NR==FNR{a[$1]=$2}NR>FNR{print $0,a[$1]}'  1.txt  2.txt
1 ab aa
2 cd bb
3 ad ee
4 bd ss
5 de
  • 解释:NR表示读取的行数,FNR表示读取的当前行数,因此其实NR==FNR 就表示读取2.txt的时候。 同理NR>FNR表示读取1.txt的时候数组a其实就至关于一个map

  1. 把一个文件多行链接成一行 http://ask.apelearn.com/question/266 例子:
[root@linux-128 awk]#cat 2.txt
1 ab
2 cd
3 ad
4 bd
5 de

print和printf的区别shell

[root@linux-128 awk]# awk '{print $1}' 2.txt
1
2
3
4
5
[root@linux-128 awk]# awk '{printf $1}' 2.txt
12345[root@linux-128 awk]# ^C

echo "" 的做用是换行数组

[root@linux-128 awk]# awk '{printf $1}' 2.txt; echo""
12345

print保持原有的格式打印,printf取消全部的格式打印,能够定义格式来打印。

[root@linux-128 awk]# awk '{printf ("%s+",$1)}' 2.txt;echo ""
1+2+3+4+5+

咱们能够用sed来实现这个需求bash

[root@linux-128 awk]# cat 2.txt|awk '{print $1}'|xargs|sed -r 's/ /+/'g
1+2+3+4+5

  1. awk中gsub函数的使用 http://ask.apelearn.com/question/200

awk中gsub函数的使用

gsub和sed中替换功能差很少函数

  1. 使用gsub
[root@linux-128 awk]# cat 1.txt
1 aa
2 bb
3 ee
4 ss
[root@linux-128 awk]# awk 'gsub(/[0-9]/,"abc")' 1.txt
abc aa
abc bb
abc ee
abc ss
  1. 使用sed替换
[root@linux-128 awk]# sed 's/[0-9]/abc/g' 1.txt
abc aa
abc bb
abc ee
abc ss
  1. awk 'gsub(/[0-9]/,"abc",$1) {print $0}' 1.txt // 替换$1中的数字为abc
[root@linux-128 awk]# awk  'gsub(/[0-9]/,"abc",$1) {print $0}' 1.txt
abc aa
abc bb
abc ee
abc ss
相关文章
相关标签/搜索