2010-05-06 10 views
5

Mam plik rozdzielany tabulatorami z 5 kolumnami i muszę pobrać liczbę tylko liczby unikatowych linii z kolumny 2. Normalnie zrobiłbym to z Perl/Python, ale ja jestem zmuszony użyć powłoki dla tego.Zliczanie unikalnych wartości w kolumnie ze skryptem powłoki

Z powodzeniem użyłem w przeszłości * funkcji nix uniq wyprowadzonej do wc, ale wygląda na to, że będę musiał użyć awk tutaj.

Każda rada byłaby mile widziana. (Już wcześniej zadawałem podobne pytanie dotyczące sprawdzania kolumn za pomocą awk, ale jest to trochę inne i chciałem je rozdzielić, więc jeśli ktoś w przyszłości ma to pytanie, to będzie tutaj)

Wielkie dzięki!
Lilly

Odpowiedz

16

Nie trzeba używać awk.

$ cut -f2 file.txt | sort | uniq | wc -l 

powinien to zrobić.

Wykorzystuje to fakt, że zakładka jest domyślnym separatorem pól cut, więc w ten sposób otrzymamy tylko treść z kolumny drugiej. Następnie przejście przez sort działa jako wstępny etap do uniq, który usuwa duplikaty. Na koniec liczymy linie, które są poszukiwaną liczbą.

+1

To jest świetne. Po tym, jak się rozejrzałam, odkryłem, że mogę znaleźć jakiekolwiek duplikaty tego pliku cat file.txt | awk "{print 2 $}" sortuj uniq -c | sort -n –

5

idę na

$ cut -f2 file.txt | sort -u | wc -l 

Przynajmniej w niektórych wersjach, uniq opiera się na danych wejściowych sortowane (wygląda tylko na sąsiednich liniach).

Na przykład w Solaris docs:

narzędzie

uniq odczyta plik wejściowy porównujące sąsiednimi liniami i zapisu jedną kopię każdego wiersza wejściowego na wyjściu. Druga i następna kopia powtarzających się sąsiednich linii wejściowych nie zostaną zapisane.

Powtórzone linie na wejściu nie będą wykrywane, jeśli nie sąsiadują ze sobą.

0
awk '{if($0~/Not Running/)a++;else if($0~/Running/)b++}END{print a,b}' temp 
Powiązane problemy