Usuń wiersze na podstawie duplikatów w jednej kolumnie bez sortowania

30

Mam duże pliki 3-kolumnowe (~ 10 000 linii) i chciałbym usunąć linie, gdy zawartość trzeciej kolumny tej linii pojawi się w trzeciej kolumnie innej linii. Rozmiary plików sprawiają, że sortowanie jest trochę kłopotliwe i nie mogę użyć czegoś takiego jak poniższy kod, ponieważ całe linie nie są identyczne; tylko treść kolumny 3.

awk '!seen[$0]++' filename
Zach C.
źródło

Odpowiedzi:

31

Po prostu zmień polecenie awk na kolumnę, którą chcesz wykonać, aby usunąć zduplikowane linie na podstawie (w twoim przypadku trzeciej kolumny):

awk '!seen[$3]++' filename

To polecenie mówi, awkktóre wiersze mają zostać wydrukowane. Zmienna $3zawiera całą zawartość kolumny 3, a nawiasy kwadratowe umożliwiają dostęp do tablicy. Tak więc dla każdej trzeciej kolumny wiersza w nazwie pliku węzeł nazwanej tablicy seenjest zwiększany, a wiersz drukowany, jeśli zawartość tego węzła (kolumna3) nie była !wcześniej ustawiona ( ).

Powyższe awkpolecenie będzie działać, jeśli kolumny w pliku wejściowym są rozdzielane między nimi spacelub Tabmiędzy nimi, jeśli kolumny rozdzielane są czymś innym, musisz powiedzieć jej, aby przebudziła się z tą -Fopcją. Na przykład, jeśli wszystkie kolumny rozdzielone przecinkami ( ,) i chcą usunąć linie na podstawie -F','opcji użycia trzeciej kolumny .

awk -F',' '!seen[$3]++' filename
αғsнιη
źródło
18

sortpolecenie jest już zoptymalizowane do obsługi dużych plików. Możesz więc bardzo dobrze użyć sortpolecenia z pliku, ponieważ

sort -u -t' ' -k3,3 file
  • -u - drukuj tylko unikalne linie.
  • -t- określ separator. W tym przykładzie po prostu używam spacji jako separatora.
  • -k3,3 - sortuj na 3. polu.

Możesz odnieść się do tej odpowiedzi, która sugeruje, że sortowanie GNU jest w rzeczywistości lepszym podejściem do sortowania dużych plików. W twoim przypadku myślę, że nawet bez tego -parallelmożesz osiągnąć swój efekt końcowy bez dużej zwłoki czasowej.

Ramesh
źródło
Miał zamiar skomentować, -uco usunie tylko duplikaty linii , a nie duplikaty kluczy ... ale się mylę.
Random
@ Ramesh wykonuje to zadanie, ale sortowanie zmienia kolejność wierszy, które, jak sądzę, nie zawsze były oczekiwane.
Bharat