前面我們曾經使用 awk 來處理列的內容。 awk 也可以處理行的內容,但是通常只對符合某種規格的資料表才有大用。 在 awk 的語法裡面,$N 代表一列中的第 N 個廣義字。 所以,
awk '{print $2, $4}' student.dat就是印出 student.dat 資料表的第二欄和第四欄資料。亦即
蔡君宗 caijz 鄒男鈞 zounj 褚永培 chuyp 周淑文 zhousz 杜霖雅 dulx 徐珍聖 xuzs 王琇凱 wangxk
我們還可以利用 awk 來交換欄位,例如
awk '{print $3, $2, $1, $4}' student.dat | sort就得到
F 杜霖雅 87114100 dulx F 周淑文 87007900 zhousz F 褚永培 87015800 chuyp M 王琇凱 86110900 wangxk M 徐珍聖 86014000 xuzs M 鄒男鈞 87113600 zounj M 蔡君宗 87250500 caijz
awk 是以廣義字來取得欄位資料。 cut 可以以格子數或 byte 數來取得直行的資料。 例如
cut -b 1-8 student.dat印出 student.dat 裡面每一列的第 1 到第 8 個字元。 一般而言,
cut -b 3,5-19,29,50-72 FILE的意思就是印出 FILE 中每一列第 3 字元、第 5 到第 9 字元、第 29 字元和 第 50 到第 72一字元。如果一列不足那麼多字元,就不會印出任何東西。
讀者或許要問,如果一個資料表不是以空白當做欄位間隔符號, 那怎麼抽出欄位資料呢?例如以下資料表的間隔符號是 : 冒號。 一整列就是一個廣義字,所以前面說的 awk 方法不靈。 欄位資料又沒對齊,所以 cut 方法也不靈。
這類問題,可以在學習了完整的 awk 程式語言之後輕易解決。 我們留給讀者日後慢慢學習。root:x:0:1:system PRIVILEGED account:/:/bin/tcsh month:x:0:5:Monthly Dump:/:/usr/etc/month week:x:0:5:Monthly Dump:/:/usr/etc/week delta:x:339:1020:Delta Electronic Co. Ltd.:/home/special/delta:/bin/tcsh
習題
注意:此處所有文件均為原著,個別的版權宣告日後會一一公布, 整體版面設計亦尚未完成。但仍請勿抄襲文字與圖片,以免觸犯著作權法。
Created: Nov 19, 2000
Last Revised: Nov 19, 2000
© Copyright 2000 Wei-Chang Shann 單維彰