/ / Sortowanie i usuwanie duplikatów na podstawie kolumny - bash, shell, sortowanie

Sortowanie i usuwanie duplikatów na podstawie kolumny - bash, shell, sortowanie

Mam plik tekstowy:

$ cat text
542,8,1,418,1
542,9,1,418,1
301,34,1,689070,1
542,9,1,418,1
199,7,1,419,10

Chciałbym posortować plik na podstawie pierwszej kolumny i usunąć duplikaty za pomocą sort, ale sprawy nie idą zgodnie z oczekiwaniami.

Podejście 1

$ sort -t, -u -b -k1n text
542,8,1,418,1
542,9,1,418,1
199,7,1,419,10
301,34,1,689070,1

Nie sortuje według pierwszej kolumny.

Podejście 2

$ sort -t, -u -b -k1n,1n text
199,7,1,419,10
301,34,1,689070,1
542,8,1,418,1

Usuwa 542,9,1,418,1 linia, ale chciałbym zachować jedną kopię.

Wygląda na to, że pierwsze podejście usuwa duplikaty, ale nie sortuje poprawnie, podczas gdy drugie sortuje, ale usuwa więcej, niż chcę. Jak mam uzyskać poprawny wynik?

Odpowiedzi:

3 dla odpowiedzi № 1

Problem polega na tym, że kiedy podajesz key do sort unikalne zdarzenia są poszukiwane dla tego konkretnego pola. Od linii 542,8,1,418,1 jest wyświetlany, sort widzi kolejne dwa wiersze zaczynające się od 542 jako duplikat i filtruje je.

Najlepiej byłoby posortować wszystkie kolumny:

sort -t, -nk1,1 -nk2,2 -nk3,3 -nk4,4 -nk5,5 -u text

lub

posługiwać się awk do filtrowania duplikatów linii i potokowania sort.

awk "!_[$0]++" text | sort -t, -nk1,1

0 dla odpowiedzi nr 2

Podczas sortowania na kluczach należy podać także koniec klawisza, w przeciwnym razie sortowanie również używa wszystkich następujących klawiszy.

Powinny działać następujące:

sort -t, -u -k1,1n text