UNIX 文字工具: 抽出欄位

前面我們曾經使用 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 方法也不靈。

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
這類問題,可以在學習了完整的 awk 程式語言之後輕易解決。 我們留給讀者日後慢慢學習。

習題

[ 前一節 ]‧[ 後一節 ]‧[ 回目錄 ]



注意:此處所有文件均為原著,個別的版權宣告日後會一一公布, 整體版面設計亦尚未完成。但仍請勿抄襲文字與圖片,以免觸犯著作權法。

Created: Nov 19, 2000
Last Revised: Nov 19, 2000
© Copyright 2000 Wei-Chang Shann 單維彰

shann@math.ncu.edu.tw