2010-04-08 11 views
13

Poszukuje się jednoczęściowego awk (lub sed), aby usunąć linie z wyjścia, jeśli pierwsze pole jest duplikatem.Usuń wiersz, jeśli pole jest duplikatem.

Przykładem usuwania zduplikowanych wierszy Widziałem to:

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

spróbował wykorzystać go na podstawie bez powodzenia (myślałem zmianie $ 0 do $ 1-by rade, ale wydawało się, że nie działa).

+0

Państwo poproszeni o usunięcie linii „jeśli pierwsze mecze pole” ... co? Przyjąłem "tę samą wartość, co pierwsze pole w poprzedniej linii wejściowej"; inna osoba przyjęła "jakiś określony wzór". Co zamierzałeś? –

+0

Twoja zmieniona wersja 'awk 'a! ~ $ 1; {a = 1 $} "* działa dla mnie * dla sąsiednich duplikatów (np. posortowany plik). ** Wersja Jonathana Lefflera ** ma tę zaletę, że będzie działać w celu usunięcia duplikatów na nieposortowanym pliku, ale kosztem stworzenia potencjalnie dużej tablicy. –

+0

Myślę, że moim głównym problemem było to, że miałem do czynienia z kilkoma różnymi typami seperatorów polowych i nie definiowałem FS poprawnie – Kyle

Odpowiedz

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

Jest to standardowe (bardzo proste) zastosowanie dla tablic asocjacyjnych.

+0

To zadziałało! Miałem kolejny błąd, którego nie zdawałem sobie z tego sprawy, co też mogło sprawiać mi problemy. Dzięki! – Kyle

8

to jak usunąć duplikaty

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

Używanie "_" jako nazwy tablicy zachęca do nieporozumień - ale działa. –

1

Jeśli jesteś otwarty na użyciu Perl:

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

-a autosplits linię do tablicy @F, która jest indeksowana zaczynając od 0
%a hash pamięta, jeśli pierwsze pole było już widoczne:


ten powiązany rozwiązanie zakłada swoją separatorem pól jest przecinek, zamiast spacji

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