awk命令扩展

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

测试文件awk.txt

及格:张三: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@localhost 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@localhost awk]#cat 1.txt    
1 aa
2 bb
3 ee
4 ss

[root@localhost awk]#cat 2.txt
1 ab
2 cd
3 ad
4 bd
5 de
[root@localhost 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@localhost awk]#cat 2.txt
1 ab
2 cd
3 ad
4 bd
5 de

print和printf的区别

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

echo "" 的作用是换行

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

print保持原有的格式打印,printf取消所有的格式打印,可以定义格式来打印。

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

我们可以用sed来实现这个需求

[root@localhost 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@localhost awk]# cat 1.txt
1 aa
2 bb
3 ee
4 ss
[root@localhost awk]# awk 'gsub(/[0-9]/,"abc")' 1.txt
abc aa
abc bb
abc ee
abc ss
  1. 使用sed替换
[root@localhost 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@localhost awk]# awk  'gsub(/[0-9]/,"abc",$1) {print $0}' 1.txt
abc aa
abc bb
abc ee
abc ss

你可能感兴趣的:(Linux)