paste 合併多欄文字 文章首圖

paste 合併多欄文字

paste 合併多欄文字:讓資料處理更高效的隱藏利器

在 Linux 的日常系統管理與資料處理中,我們經常需要將多個檔案的欄位合併在一起,或是將一個檔案中的每一行內容並排顯示。雖然 awkjoin 也能達成類似目的,但對於簡單的並排合併任務,paste 指令無疑是最直觀且高效的选择。它就像是一把精密的剪刀與膠水,能將分散的資料流整齊地拼接成我們需要的格式。今天,我們將深入探討 paste 的運作原理與實用技巧。

基本語法與運作邏輯

paste 指令的基本語法非常簡潔:

paste [選項] [檔案...]

若不指定任何檔案,paste 會從標準輸入(Standard Input)讀取資料。當提供多個檔案時,它會將這些檔案的對應行號(第 1 行對第 1 行,第 2 行對第 2 行...)並排合併。預設情況下,paste 使用 Tab 字元 作為欄位分隔符號。

讓我們透過實際範例來觀察它的行為。首先,建立兩個簡單的測試檔案:

# 建立檔案 file1.txt
echo -e "Alice\nBob\nCharlie" > file1.txt

# 建立檔案 file2.txt
echo -e "25\n30\n35" > file2.txt

接著,使用 paste 合併這兩個檔案:

paste file1.txt file2.txt

輸出結果如下:

Alice   25
Bob 30
Charlie 35

可以看到,file1.txt 的第一行與 file2.txt 的第一行被合併,中間以 Tab 分隔。這種行為非常適合用於將 ID 與名稱、或鍵與值進行快速對應。

進階選項:客製化分隔符號

預設的 Tab 分隔符在某些情境下(例如輸出到 CSV 或純文字報告)可能不夠美觀或難以解析。paste 提供了 -d(delimiter)選項來允許使用者自訂分隔符號。

1. 使用逗號分隔(模擬 CSV 格式)

若希望輸出結果以逗號分隔,可以使用 -d ','

paste -d ',' file1.txt file2.txt

輸出結果:

Alice,25
Bob,30
Charlie,35

2. 使用多個分隔符

這是一個非常實用的功能:當合併的檔案數量多於指定的分隔符數量時,paste 會循環使用這些分隔符。例如,合併三個檔案,並指定分隔符為 :-

# 建立第三個檔案
echo -e "A\nB\nC" > file3.txt

paste -d ':,-' file1.txt file2.txt file3.txt

輸出結果:

Alice:25-A
Bob:30-B
Charlie:35-C

這裡可以看到,第一個分隔符 : 用於前兩個檔案之間,第二個分隔符 - 用於第二和第三個檔案之間。如果還有第四個檔案,分隔符會再次循環回到 :

3. 合併單一檔案的多欄(轉置資料)

paste 最強大的功能之一,是將單一檔案的「行」轉置為「欄」。這在需要將垂直列表轉換為水平列表時非常有用。只需重複使用相同的檔案作為輸入,並指定分隔符即可。

假設我們有一個長列表,想將其變成一行顯示:

paste -s -d ' ' file1.txt

這裡的 -s(serial)選項告訴 paste 將單一檔案的所有行依序合併,而不是並排合併。輸出結果:

Alice Bob Charlie

若希望每個項目之間用分號分隔:

paste -s -d ';' file1.txt

輸出結果:

Alice;Bob;Charlie

常見問題與注意事項

在使用 paste 時,有兩個常見的陷阱需要注意:

1. 檔案行數不一致時的行為

當合併的檔案行數不一致時,paste 會以較長的檔案為準,較短檔案的缺失行會以 空白字元 填充。

# file4.txt 只有兩行
echo -e "X\nY" > file4.txt

paste file1.txt file4.txt

輸出結果:

Alice   25
Bob 30
Charlie 

注意第三行,file4.txt 沒有第三行,因此對應位置為空白。這在處理不齊全的資料時需特別小心,避免後續處理時因空白值而產生錯誤。

2. 特殊字元與轉義問題

當使用自訂分隔符時,若分隔符本身包含特殊字元(如空格或反斜線),需謹慎處理。例如,使用空格作為分隔符時,建議使用 -d ' ' 並確保引號正確,或在某些 shell 環境中直接使用 -d ' '。此外,若檔案內容本身包含 Tab 字元,合併後可能會造成解析混亂,建議在合併前先用 trsed 清理資料。

小結

paste 是一個小而美的 Linux 指令,雖然功能看似單一,但透過 -d-s 選項的靈活搭配,它能輕鬆解決許多資料格式轉換的需求。無論是將多個檔案並排合併、轉換 CSV 格式,還是將垂直列表轉為水平列表,paste 都能以極少的指令達到目的。對於經常處理純文字資料的 Linux 使用者來說,掌握 paste 能顯著提升工作效率,是 Shell 腳本編寫中不可或缺的工具之一。下次遇到需要「拼湊」資料的情境時,別忘了試試這把順手的「剪刀與膠水」。