168 瀏覽數

Linux command – awk 資料的列轉行

透過 sed 與 awk 都可以把文件做過濾和轉換成新的輸出內容.不過 sedhttp://benjr.tw/97129 適合用於一整行的資料處理,而 awk 則比較適合將一整行做多個 欄位(Field) 的資料處理.先來看看 awk 的幾個範例.

# mawk  [-W  option]  [-F value] [-v var=value] [--] 'program text' [file...]

awk 是 mawk 的連結,兩種方式都可以下指令.

資料的列 row 要轉成行 column 可以透過 awk 來轉換,指令也只有短短一行.
要轉的資料如下所示:

root@ubuntu:~# cat pw
root:/root:/bin/bash
daemon:/usr/sbin:/usr/sbin/nologin
bin:/bin:/usr/sbin/nologin
sys:/dev:/usr/sbin/nologin
sync:/bin:/bin/sync
games:/usr/games:/usr/sbin/nologin
man:/var/cache/man:/usr/sbin/nologin
root@ubuntu:~# awk 'BEGIN {FS=":"} {a=a$1" ";b=b$2" ";c=c$3" "}END{print a"\n"b"\n"c}' pw
root daemon bin sys sync games man 
/root /usr/sbin /bin /dev /bin /usr/games /var/cache/man 
/bin/bash /usr/sbin/nologin /usr/sbin/nologin /usr/sbin/nologin /bin/sync /usr/sbin/nologin /usr/sbin/nologin 

指令說明:

BEGIN {FS=":"}

FS (Fields splits) 預設的欄位區分是以 空白或是 tab 做分隔,要改成其他如 冒號 “:” 來作欄位的分隔時就需要設定 FS 變數.
awk 在執行時就會先把第一行的資料讀取進來等待處理,所以 FS 的定義必須透過 BEGIN{} ,所定義的內容只會執行一次.

{a=a$1" ";b=b$2" ";c=c$3" "}

a , b , c 在 awk 語法都是變數.
$1 代表第一欄資料, $2 代表第二欄資料, $3 代表第三欄資料
a=a$1 會把同欄的資料不斷的累加上去,再加上 ” ” 空白鍵,用以區隔不同欄位的資料.

END{print a"\n"b"\n"c}

END {} 只會在最後時執行一次,把變數 a b c 都列應出來,行與行之間用 \n (newLine) 做分割.

發表迴響