2010-04-08 133 views
13

如果第一個字段是重複的,則查找awk(或sed)單行程以刪除輸出中的行。如果字段重複,則刪除行

去除我見過重複行的一個例子是:

awk 'a !~ $0; {a=$0}' 

使用它,沒有運氣的基礎試過了(我以爲改變$ 0'到$ 1的會做的伎倆,但似乎沒有工作)。

+0

您要求刪除行「如果第一場比賽」 ......什麼?我假設'和前面一些輸入行中第一個字段的值相同';另一個人假定「某種特定模式」。你打算做什麼? – 2010-04-08 23:24:50

+0

您更改的版本'awk'a!〜$ 1; {a = $ 1}''*適用於我*的相鄰副本(例如排序文件)。 ** Jonathan Leffler的**版本的優點是,它可以消除未分類文件上的重複項,但是以創建潛在的大型數組爲代價。 – 2010-04-08 23:43:56

+0

我認爲我的主要問題是,我正在處理幾種不同類型的字段分隔符,並沒有正確定義FS – Kyle 2010-04-09 15:36:14

回答

25
awk '{ if (a[$1]++ == 0) print $0; }' "[email protected]" 

這是一個關聯數組的標準(非常簡單)用法。

+0

工作正常!我還遇到了另一個我並沒有意識到的錯誤,這也可能會給我帶來問題。謝謝! – Kyle 2010-04-08 23:25:27

8

這是如何。如果你打開使用Perl刪除重複

awk '!_[$1]++' file 
+2

使用'_'作爲數組名稱會引起誤解 - 但它起作用。 – 2010-04-09 00:07:09

1

perl -ane 'print if ! $a{$F[0]}++' file 

-a autosplits行成@F陣列,其索引從0開始
%a哈希記錄是否已經看到第一個字段


此相關的解決方案假定您的分隔符是逗號,而不是空格

perl -F, -ane 'print if ! $a{$F[0]}++' file