cut 與 paste:文字欄位處理技巧
在 Linux 系統管理與資料處理的日常工作中,我們經常需要從龐大的純文字檔中提取特定資訊,或是將多個檔案的資料進行横向合併。雖然 awk 和 sed 是強大的文字處理利器,但它們的語法相對複雜,對於簡單的欄位提取與合併任務來說,往往顯得大材小用。此時,cut 與 paste 這兩個指令便是最佳選擇。它們專精於「欄位」與「行」的操作,語法簡潔直觀,能大幅提升資料清洗的效率。本文將深入解析這兩者的用法,並提供在 Ubuntu 22.04 / Debian 12 環境下可直接執行的實戰範例。
cut:精準提取文字欄位
cut 指令的主要功能是從每行中選取特定的欄位或字元。它非常適合處理以特定分隔符號(如空白鍵、Tab 鍵、逗號等)分隔的結構化資料。
基本用法與選項
cut 的核心選項包括 -f(指定欄位)、-d(指定分隔符號)以及 -c(指定字元位置)。預設情況下,cut 以 Tab 鍵作為分隔符號。
範例 1:提取使用者帳號
在 Linux 系統中,/etc/passwd 檔案記錄了所有使用者資訊,欄位之間以冒號 : 分隔。我們想提取第一個欄位(帳號名稱):
# 提取 /etc/passwd 的第一個欄位
cut -d ':' -f 1 /etc/passwd
輸出結果將列出所有系統帳號,如 root、daemon、nobody 等。這裡 -d ':' 告訴 cut 使用冒號作為分隔符,-f 1 表示只取第一個欄位。
範例 2:提取多個欄位
若想同時提取帳號與使用者 ID(UID),我們可以指定多個欄位:
# 提取第 1 欄(帳號)與第 3 欄(UID)
cut -d ':' -f 1,3 /etc/passwd
輸出範例:
root:0
daemon:1
bin:2
若需提取連續的欄位範圍,可使用連字號,例如 -f 1-3 表示提取第 1 到第 3 欄。
範例 3:以字元位置提取
有時資料並非以明確的分隔符號區隔,而是固定寬度。此時可使用 -c 選項。例如,提取每行的前 5 個字元:
echo "Hello World" | cut -c 1-5
輸出:Hello
paste:横向合併檔案內容
與 cut 縱向切割不同,paste 指令負責將多個檔案的內容「横向」合併。當你需要將兩個獨立檔案的資料對應起來時,paste 無可取代。
基本用法與選項
paste 預設以 Tab 鍵作為欄位分隔符號。若需其他分隔符號,可使用 -d 選項。
範例 4:合併兩個檔案
假設我們有兩個檔案 names.txt 與 ages.txt:
# 建立測試檔案
echo -e "Alice\nBob\nCharlie" > names.txt
echo -e "25\n30\n35" > ages.txt
執行合併:
paste names.txt ages.txt
輸出結果:
Alice 25
Bob 30
Charlie 35
可以看到,paste 自動將兩個檔案的對應行合併,並以 Tab 鍵分隔。
範例 5:自訂分隔符號
若希望使用逗號或其他符號作為分隔符,可結合 -d 選項:
# 使用逗號作為分隔符
paste -d ',' names.txt ages.txt
輸出:
Alice,25
Bob,30
Charlie,35
此外,paste 也支援將單一檔案的內容纵向排列(預設行為),或使用 -s 選項將單一檔案的所有行合併為一行,這在處理需要將多行數據轉換為 CSV 格式時非常實用。
常見問題與注意事項
在使用 cut 與 paste 時,新手常會遇到以下問題:
-
分隔符號設定錯誤導致無法正確切割 許多使用者在處理 CSV 檔案時,直接執行
cut -d ',' -f 1,但若檔案中逗號前後有空格,或欄位內包含逗號(被引號包裹),cut會因為無法識別複雜的 CSV 結構而產生錯誤結果。建議在處理複雜 CSV 時,先確認資料格式,或考慮使用awk或csvkit等更強大的工具。 -
paste 合併行數不對齊 若兩個待合併檔案的行數不同,
paste會以較長的檔案為主,較短的檔案對應位置會顯示為空白。這可能導致後續處理時產生意外錯誤。因此在合併前,務必使用wc -l檢查檔案行數是否一致:wc -l names.txt ages.txt
小結
cut 與 paste 是 Linux 文字處理工具鏈中不可或缺的基本指令。cut 擅長從結構化資料中快速提取特定欄位,而 paste 則能輕鬆將多個檔案横向合併。雖然它們的功能不如 awk 廣泛,但在處理簡單、明確的欄位操作時,其語法簡潔、執行效率高的優勢顯而易見。掌握這兩個指令,能讓您在日常系統管理與資料處理工作中事半功倍。建議多利用管道(pipe)將它們與其他指令結合,例如 cat file.log | cut -d ' ' -f 2 | paste -s -d ',',以發揮最大的威力。