CodeGym /Adesua ahorow /Docker SELF /使用 `awk` 進行數據格式化

使用 `awk` 進行數據格式化

Docker SELF
等級 8 , 課堂 2
開放

使用 awk 進行數據格式化

1. 認識 awk

awk 是一個強大的文字處理工具。如果把一個文字檔案想像成一張表格,行就是行(沒錯),而列則是被空格分隔的數據,那麼 awk 就是我們的好朋友。它能幫助我們快速選擇列、篩選行、格式化數據,甚至執行算術操作。

它的名字來自於作者的名字 — Alfred Aho、Peter Weinberger 和 Brian Kernighan(沒錯,就是那位參與創建 C 語言的人)。

awk 的核心概念是通過模式和動作來處理數據,讓它像是一個迷你版的程式語言。

awk 的語法

命令的基本語法如下:

awk '模式 {動作}' 檔案
  • 模式 — 每行檔案會檢查的條件。
  • 動作 — 對符合條件的行執行的操作。
  • 如果沒有提供模式,動作會對每一行執行。

範例:

awk '{print $1}' data.txt

這條命令會列印出檔案 data.txt 每一行的第一列($1)。


2. awk 的主要功能

1. 選擇列

使用 awk 最簡單的方式就是從檔案中選擇一列或多列。欄位以 $n 表示,其中 n 是從 1 開始的列號。

範例:

輸出第一和第三列:

awk '{print $1, $3}' data.txt

假設我們的檔案 data.txt 看起來是這樣的:

John 25 Engineer
Jane 30 Designer
Mike 28 Developer

結果:

John Engineer
Jane Designer
Mike Developer

2. 條件處理列

條件允許只處理符合特定條件的列。

範例:

輸出第二列值大於 27 的列:

awk '$2 > 27 {print $1, $2}' data.txt

結果:

Jane 30
Mike 28

3. 算術操作

awk 可以執行算術操作。當需要立即計算一些內容時非常有用。

範例:

將第二列的值加 10:

awk '{print $1, $2+10}' data.txt

結果:

John 35
Jane 40
Mike 38

4. 計算列數

awk 自動知道處理了多少列。這些資訊存儲在變數 NR(Number of Records)中。

範例:

計算檔案中的列數:

awk 'END {print NR}' data.txt

結果:

3

3. 進階功能

1. 輸出格式化

awk 支援透過 printf 函數進行強大的格式化輸出。這是 C 語言中 printf 函數的類似物。

範例:

以對齊方式輸出資料:

awk '{printf "%-10s %-5s %-10s\n", $1, $2, $3}' data.txt

結果:

John       25    Engineer  
Jane       30    Designer  
Mike       28    Developer 

2. 變數

你可以使用變數來保存資料並簡化操作。

範例:

計算第二欄的總和:

awk '{sum += $2} END {print "總年齡:", sum}' data.txt

結果:

總年齡: 83

3. 正規表示式

awk 支援正規表示式以搜尋字串。

範例:

輸出第一欄中有字母 J 的行:

awk '/J/ {print $0}' data.txt

結果:

John 25 Engineer
Jane 30 Designer

4. 實際案例

1. 系統日誌分析

假設我們有一個系統日誌文件 /var/log/syslog,我們希望知道哪些進程最常被提及。

指令:

cat /var/log/syslog | awk '{print $5}' | sort | uniq -c | sort -nr | head -10

這段指令做了什麼:

  1. cat /var/log/syslog — 讀取文件內容。
  2. awk '{print $5}' — 提取第五列(進程名稱)。
  3. sort — 按字母順序排序行。
  4. uniq -c — 計算唯一行的數量。
  5. sort -nr — 按數值從高到低排序行。
  6. head -10 — 輸出前10個進程。

2. 工資報告準備

我們有一個文件 salaries.txt:

John 25 4000
Jane 30 5000
Mike 28 4500

任務:

將工資提高10%,並顯示最終報告。

解決方案:

awk '{new_salary = $3 * 1.1; printf "%-10s %-5s %-10.2f\n", $1, $2, new_salary}' salaries.txt

結果:

John       25    4400.00
Jane       30    5500.00
Mike       28    4950.00

5. 使用 awk 時的常見錯誤

分隔符的問題

預設情況下,awk 使用空格或制表符作為分隔符。如果你的數據用其他東西(例如逗號或冒號)分隔,必須用 -F 選項來指定。

範例:

文件 data.csv:

John,25,Engineer
Jane,30,Designer
Mike,28,Developer

處理 CSV 的命令:

awk -F',' '{print $1, $3}' data.csv

結果:

John Engineer
Jane Designer
Mike Developer

由於格式問題導致的欄位遺漏

有時候,行可能包含意外的空格或缺少的欄位。這可能會引發錯誤。在開始處理之前檢查數據總是有幫助的。

實際應用

你剛剛學會使用 awk 來分析系統日誌、處理薪資數據以及生成報告。這些技能在處理大型數據庫、CSV 文件和真實項目的日誌時會很有幫助。如果你從事 DevOps,使用 awk 分析系統日誌會成為你的超能力。而如果你是開發者,直接從終端快速操作數據也非常實用。

如果想更深入地學習 awk,建議閱讀 GNU Awk 官方文檔。現在你肯定知道如何讓你的數據更聽話了!

留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION