Linux 中是否有按列“uniq”的方法?


簡介

在 Linux 作業系統中,“uniq” 命令用於從已排序的檔案中刪除重複行。但是,有時您可能需要根據特定列而不是整行來刪除重複項。當處理基於列的輸入檔案(例如 CSV 檔案)時,這將變得特別有用。在本文中,我們將探討在 Linux 上執行此類按列“uniq”的幾種方法。

方法 1:使用 sort 命令

sort 命令是一種簡單有效的方法,可以按特定欄位對行進行排序並從排序結果中刪除重複項。對於重複項,只會保留第一個例項。在本節中,我們將探討如何使用 sort 命令解決刪除特定列中重複條目的問題。

  • 使用 tail 命令刪除標題行 -

$ tail -n+2 price.csv | sort -u -t, -k1,1                        
Keybord,20,2019-02-02
Monitor,218,2019-01-01
Wireless Mouse,25,2019-02-02

前面的命令使用 tail 命令刪除檔案的首行(通常是標題行),並將檔案的其餘部分路由到 sort 命令。然後,sort 命令用於對行進行排序並使用 -u 選項刪除重複項。“-t”選項用於將欄位分隔符設定為逗號,“-k1,1”選項用於按第一列排序。

  • 在輸出中保留標題行 -

$ head -n1 price.csv && tail -n+2 price.csv | sort -u -t, -k1,1 
Product,Price,Update
Keybord,20,2019-02-02
Monitor,218,2019-01-01
Wireless Mouse,25,2019-02-02

此命令與前一個命令類似,但使用 head 命令列印檔案的首行(通常是標題行),然後使用 tail 命令刪除標題行並對檔案的其餘部分進行排序。

方法 2:使用 awk 命令

執行按列“uniq”操作的另一種方法是使用 awk 命令。Awk 是一種功能強大的文字處理工具,可用於選擇和操作檔案中的特定列。對於按列“uniq”,我們可以使用以下命令 -

$ awk -F, 'NR==1 || !a[$1]++' price.csv 
Product,Price,Update
Monitor,218,2019-01-01
Keybord,20,2019-02-02
Wireless Mouse,25,2019-02-02

以上命令使用 awk 命令使用“-F”選項將欄位分隔符設定為逗號。表示式“NR==1”用於處理標題行,該行將列印在輸出中。表示式“!a[$1]++”用於透過為第一列中的每個唯一條目建立關聯陣列元素並忽略任何重複項來刪除第一列中的重複條目。

方法 3:使用帶 -f 選項的 uniq 命令

在 Linux 上按列“uniq”的第三種方法是使用帶“-f”選項的 uniq 命令。“-f”選項可用於在比較行之前忽略指定的欄位數。對於按列“uniq”,我們可以使用以下命令 -

$ sort file.txt | uniq -f 0

此命令將對檔案“file.txt”進行排序,然後使用帶“-f”選項的 uniq 命令在比較行之前忽略第一個欄位(列)。這樣,uniq 命令在刪除重複項時只會考慮第二個及後續欄位,從而有效地按列“uniqing”。

結論

在本文中,我們討論了在 Linux 上執行按列 uniqing 的三種不同方法。第一種方法使用 sort 命令,第二種方法使用 awk 命令,第三種方法使用帶“-f”選項的 uniq 命令。每種方法都可用於選擇和刪除檔案特定列中的重複值。方法的選擇將取決於業務的具體需求和使用者偏好。需要注意的是,此處討論的所有方法都需要對輸入檔案進行排序,因此建議您在使用任何這些命令之前對檔案進行排序。還需要提及的是,這裡的所有示例都使用逗號作為欄位分隔符,如果您的檔案使用其他分隔符,請相應地調整命令。

更新於: 2023年2月13日

3K+ 瀏覽量

開啟你的 職業生涯

透過完成課程獲得認證

開始學習
廣告