- 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选项。应用于脚本中:
- 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
- 把一个文件多行连接成一行 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
- awk中gsub函数的使用 http://ask.apelearn.com/question/200
awk中gsub函数的使用
gsub和sed中替换功能差不多
- 使用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
- 使用sed替换
[root@localhost awk]# sed 's/[0-9]/abc/g' 1.txt
abc aa
abc bb
abc ee
abc ss
- 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