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

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

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.


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.