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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章