- 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