目錄:
(九)兩個文件合併
(十)關於NFS權限的設置
(十一)求交集
(十二)統計字符出現的次數
(十三)求和
(十四)案例實戰數組
(九)兩個文件合併
(9.1)首先咱們在系統中定義兩個文件a1和a2,如今咱們的需求是使用a1的第二個字段去比對a2的第二個字段,若是相同,則將a1的第一個字段添加到a2文件的第三個字段上,最終以a2文件爲模板打印出對應的信息,若是多個文件進行合併能夠考慮使用數組
# awk -F"[ ,]" 'NR==FNR{a[$2]=$1}NR!=FNR{print $0,a[$2]}' a1 a2
(9.2)咱們建立兩個文件b1和b2,如今咱們但願將兩個文件合併爲以下的格式,咱們發現b1的第二列和b2的第一列是共同項,而後咱們在當NR不等於FNR的時候,會進行打印的操做,記得在字段之間使用「:」冒號進行分隔。
咱們但願打印的結果以下:
tom:001:aa
tom:001:bb
bob:002:cc
bob:002:dd
# awk -F: 'NR==FNR{a[$2]=$0}NR!=FNR{print a[$1]":"$2}' b1 b2
(9.3)咱們建立一個c1和c2文件,若是c1的$1和c2的$3相同,c1的$2和c2的$4的後三個字符相同,c1的$3和c2的$6相同,那麼打印c2中符合條件的行,若是需求是篩選多個共同列,咱們只要把這多個共同列進行合併比較便可。咱們發現c1中的第1列加第2列加第3列與c2文件中的第3列加第4列後三個字符加第6列,若是是相同的,那麼就符合需求,能夠將c2文件中的當前行打印出來。
# awk 'NR==FNR{a[$1]=$1$2$3}NR!=FNR{X=substr($4,3);Y=$3X$6;if(Y==a[$3]){print}}' c1 c2
(9.4)咱們建立一個文件d1和d2,此時咱們但願將d2文件中的第2個字段替換到d1文件的第2個字段,首先要注意在使用文件名時要先用d2而後使用d1,同時指定輸入和輸出的分隔符都爲「:」冒號,而後執行將d2文件中的第2個字段替換到d1文件的第2個字段的操做。
# awk -F: 'BEGIN{FS=OFS=":"}NR==FNR{a[$1]=$2}NR!=FNR{$2=a[$1];print}' d2 d1ide
(十)相同行合併爲一行
(10.1)咱們建立一個文本文件aa1,如今咱們的需求是將一個文件中將擁有相同字段的行合併成一行,例如第一行第1個字段是27,第二行第1個字段也是27,則將第二行第2個字段的信息直接打印在第一行第3個字段的位置,第三行第1個字段是26,因此直接打印到下一行,以此類推。首先使用NR是否等於1來進行判斷,若是NR爲1則打印當前行並將第一行第1個字段賦值給變量x,接着是第二行,發現NR不等於1了,可是第二行第1個字段等於變量x的值,因此此時用printf打印此" %s"格式,而後處理第三行,咱們發現符合「else if($1!=x)」這個條件,因此此時咱們會先打印一個換行符「\n」而後再打印這一整行的內容,並將當前行的第1個字段賦值給變量x,這樣咱們就基本能夠實現咱們所需求的格式了。
# awk 'NR==1{printf "%s", $0;x=$1}NR!=1{if($1==x){printf " %s", $2}else if($1!=x){printf "\n%s", $0;x=$1}}END{printf "\n"}' aa1函數
(十一)求交集
(11.1)如今咱們建立了兩個文件a1和a2,如今要求打印a1文件中的一些行,a1的第2字段出如今a2的第1個字段中,如今若是要求a的某部分是否出如今b的某部分裏的時候,那麼咱們就把b的那部分設置爲數組的下標,而後判斷a的那部分是不是下標的一個元素。此時則應該爲「awk -F」[,/]」 ‘’ a2 a1」
# awk -F"[,/]" 'NR==FNR{a[$1]=$0}NR!=FNR{if($2 in a){print $0}}' a2 a1
(11.2)如今咱們建立兩個文件b1和b2,如今咱們的需求是打印b1的一些行,b1的$1出如今b2的第1個字段裏,找到那些行以後,並把b2裏對應的這些行的$2部分進行求和,咱們能夠先在b2文件中將全部的第1字段的第2個字段值進行相加操做,最後在b1文件行打印出來時也把相加的值一同打印出來。
# awk -F, 'NR==FNR{a[$1]+=$2}NR!=FNR{if($1 in a){printf "%s,%f\n",$0,a[$1]}}' b2 b1工具
(十二)統計字符出現的次數
(12.1)咱們有一個文件a1,如今咱們須要統計每一個字符在文本文件中出現的次數,此時咱們的思路是遇到一個字段就將其設置爲一個元素的下標,當咱們已經定義了一個元素時,若是下次再遇到這個下標的元素的時候,則加上1次。咱們首先是使用循環遍歷每一行,使用遍歷的字段做爲數組的下標,若是後面出現了相同的字段,則將統計的結果加1,而後在END中去遍歷數組中每一個元素當前的數值,此時就能夠獲得每一個字符在文本文件中出現的次數。
# awk '{for(i=1;i<=NF;i++){a[$i]++}}END{for(x in a){print x"一共出現了"a[x]"次"}}' a13d
(十三)求和
(13.1)在咱們的內存中正常是會將內存的數據寫入到硬盤中的,所以內存的數據和硬盤的數據是同步的,咱們稱之爲乾淨數據,可是有時候在咱們的內存中有些數據修改完後並無寫入到硬盤中去,內存中的數據和硬盤數據並不一樣步,此時這類數據咱們稱之爲髒數據,若是髒數據沒有及時寫入到硬盤,那麼當計算機重啓以後沒有寫入到硬盤的數據就會丟失了。如今咱們的需求是計算出某個進程一共有多少個乾淨頁,有多少個髒頁,咱們是能夠從/proc/1/smaps的系統映射文件中查看到咱們所需的內存相關信息的,咱們可使用模式匹配的方式,將乾淨頁和髒頁分別進行統計,在以前的基礎上進行連加操做。
# cat /proc/1/smaps
# cat /proc/1/smaps | awk '/Shared_Clean/{AA+=$2}/Shared_Dirty/{BB+=$2}END{print "乾淨頁總合是"AA"KB";print "髒頁的總合是"BB"KB"}'
(13.2)如今咱們有兩個文件a1和a2,由於咱們發現a1文件和a2文件的列數是同樣的,因此如今咱們的需求是但願將a1文件和a2文件中對應的列數進行相加獲得一個相加後的一行數組。解決這個問題的思路咱們是把一個文件裏全部的數字放在一個數組裏保存,而後讀取第二個文件,把第二個文件裏全部的數組保存,而後分別相加(圖13-5)。固然咱們也可使用getline函數解決問題,首先使用for循環獲取a1文件的全部值,而後使用getline讀取a2文件讀取的行替換到當前所在行的信息,最後使用for循環去遍歷數組a與當前a2文件中的每一個字段,並進行相加的操做,此時也能夠獲得咱們所需的結果(圖)。
# awk 'NR==FNR{for(i=1;i<=NF;i++){a[i]=$i}}NR!=FNR{for(i=1;i<=NF;i++){b[i]=$i;printf "%s ",a[i]+b[i]}}END{printf "\n"}' a1 a2
# awk '{for(i=1;i<=NF;i++){a[i]=$i};getline < "a2";for(i=1;i<=NF;i++){printf "%s ",a[i]+$i}printf "\n"}' a1blog
(十四)案例實戰
(14.1)取得網卡的IP
# ifconfig | grep 'inet' | grep broadcast | awk '{print $2}'
(14.2)取得系統內存大小
# cat /proc/meminfo | awk '/MemTotal/{print $2}'
(14.3)修改CSV文件各字段的順序,咱們先在系統中建立一個data.csv的文件,想要把第2個字段和第4個字段進行調換。
# cat data.csv | awk -F, 'BEGIN{OFS=","} {print $1,$4,$3,$2,$5,$6,$7}'進程
—————— 本文至此結束,感謝閱讀 ——————內存