這兩天做《linux作業系統》課程的作業,碰到了乙個題目,感覺很有意思,很考驗對awk掌握的熟練度,故特意拿來分享。
首先說題目是這樣的,有這樣一段文字:
record然後要我們利用sed和awk,改啊改,改成這個樣子:#這是多餘的注釋行one
#record_type students
#這是多餘的注釋行two
f sno
11111110000
f name 王鐵蛋
f gender 男
f age
20f
class
網路工程01
f region 湖北省武漢市
.record
#這是多餘的注釋行one
#record_type scores
#這是多餘的注釋行two
f sno
1205110606
f mathematics
92f english
88f chinese
86f history
79f politics
83
這個怎麼做呢,首先就是要去掉那個多餘的注釋行,那個很好去掉,就是利用sed的正規表示式判斷就好了,以#開頭的,且後面跟著的不是r這個字元,那麼就把這行刪除,具體命令如下:
這樣就可以去掉多餘的注釋行了。
接下來我們就要進入主題了,利用awk來對文字進行處理。
根據結果來看,可以看到這個題目中awk其實一共錄入了兩個record,也就是說我們的記錄分隔符rs不能再用回車了,得用原文本中的那個點,同時,每條記錄中的每個域應該就是record行到「.」行的每一行,所以我們的域分隔符也應該換一下,變成回車。所以awkbegin時執行命令應該是這兩條。
接下來就得要分析,如何列印開頭的那個record (1) 「students」了,括號裡面的那個數字應該是當前記錄號,而後面的那個students應該是取自record_type那一行,這個具體要怎麼做呢,其實很簡單,如下:
用for迴圈分別取出每個域,然後判斷,如果以#開頭,那麼則說明是#record_type 那一行,我們就對這一行利用gsub函式進行處理。
那個gsub函式是幹嘛的呢,其實就是乙個替換(substitute)函式,它利用第乙個引數裡的正規表示式來對第三個引數進行查詢,將查詢到的內容用第二個引數進行替換。具體到本栗子中就是,查詢以#開頭空格結束這麼一段內容,然後用空字串進行替換。這樣其實就是做了乙個刪除的功能。這樣處理之後,#record_type students就變成了students了,然後我們再來進行輸出就好了,需要注意的是,print函式類似於c語言的printf函式,可以直接對字串進行連線,所以上面那個print第二個引數其實就是輸出了「students」。
輸出了頭之後,我們就該輸出中間的內容了,我們可以很容易地發現乙個規律就是所有內容都是以f開頭的,所以這裡我們就可以這樣處理。
首先判斷這個域的內容是不是以f開頭的,如果是,則進行處理。
中間那個split函式的功能就是進行分割,對$i字串的內容以第三個引數空格進行分割,然後將分割的結果存放到第二個引數所代表的陣列中,然後再來將內容輸出就好了。
整個for迴圈結束之後,再來列印一遍這條記錄結束了,這樣就能實現我們的功能了。
最後再把**整體貼一遍,希望對各位有所幫助:
1 #!/bin/bash2#history:
3 # michael 4月,27,201545
sed'
/#[^r].*/d
' recordmda.txt |\67
awk'
8begin
1220
else
if($i ~ /f.*/)
2125
}26 print "
end of record (
"nr")"
27}28'
2930
# gsub函式的功能就是通過第乙個引數的正規表示式在第三個引數中查詢特定字串,然後用第二個引數來替換這個字串,具體到本例中就是將#record_type score字串中空格前面的內容全部刪掉
3132 # split函式的功能就是分割,通過第三個引數來將第乙個引數的內容進行分割,並將分割的結果存放到第二個引數所代表的陣列中
Shell中awk和sed的一些使用
for i inps ef grep jhds awk do kill 9 i done free m awk sed s shared free m awk sed s shared awk end free m sed 1d awk end free m sed 1d awk end awk命令...
請教乙個AWK處理兩個檔案公共字段結合的題目
在檔案score.txt中存有如下資料 姓名 分數 lisi 88 bokeyuan 97 zhangsan 77 wangwu 89 hongliu 92 zhanghua 97 在檔案student.txt中存有 zhangsan hongliu 使用awk,cut,grep,find等任意sh...
sed 正則的乙個小問題
有一段類似以下的文字 aabbccc test 3307 112323553 66778tp aooppx69tp ooppsg aabbccc test 3307 1127233 6674tp booppx67tp oofs3g aabbccc test 3307 1125233 6277558t...