2012-11-27 16 views
5
1.gui Qxx 16 
    2.gu Qxy 23 
    3.guT QWS 18 
    4.gui Qxr 21 

chcę sortować plik zależności wartość w kolumnie 3, więc używam:Bash - czy można użyć -uniq tylko dla jednej kolumny linii?

sort -rnk3 myfile 

2.gu Qxy 23 
4.gui Qxr 21 
3.guT QWS 18 
1.gui Qxx 16 

teraz mam wyjścia, jak: (linia zaczynając 3.gui jest z powodu linii z 4.gui ma większą wartość)

2.gu Qxy 23 
4.gui Qxr 21 
1.guT QWS 18 

nie mogę korzystać -head bo mam miliony wierszy i nie gdzie wyciąć zrobić, nie mogłem zrozumieć sposób korzystania -uniq ponieważ traktuje jako linię cały i ponieważ nie mogę powiedzieć -uniq, aby spojrzeć na pierwszą kolumnę, zlicza linię, która ma unikalny wynik - co jest normalne-. wiem -uniq może zignorować liczbę znaków, ale jak widać z przykładu pierwsza kolumna może mieć różne liczby znaków ..

Proszę o poradę ..

+0

możliwe duplikat [Czy istnieje sposób „uniq” przez kolumnę?] (Http : //stackoverflow.com/questions/1915636/is-there-a-way-to-uniq-by-column) –

Odpowiedz

8

Spróbuj tego:

sort -rnk3 myfile | awk -F"[. ]" '!a[$2]++' 

awk usuwa duplikaty w zależności od 2. kolumny. Jest to tak naprawdę słynna składnia awk, aby usunąć duplikaty. Tablica jest utrzymywana w miejscu, gdzie zachowany jest rekord 2. pola. Za każdym razem przed wydrukowaniem rekordu, drugie pole jest zaznaczone w tablicy. Jeśli nie jest obecny, jest drukowany, w przeciwnym razie jest odrzucany, ponieważ jest duplikatem. Osiąga się to za pomocą ++. Po raz pierwszy, gdy napotkany zostanie rekord, to ++ zachowa liczbę jako 0 od czasu jego naprawy. Kolejne zdarzenie zwiększy wartość, która po zanegowaniu stanie się fałszywa.

+0

@Guru .. Czy mógłbyś wyjaśnić polecenie -awk? – teutara

+1

@teutara: Zaktualizowany – Guru

+0

- dzięki za tonę. nie rozumiem, dlaczego używam drugiego rzędu (mieszania). – teutara

2

Proszę bardzo:

sort -rnk3 file | awk -F'[. ]' '{ if (a[$2]++ == 0) print }' 

2.gu Qxy 23 
4.gui Qxr 21 
1.guT QWS 18 

używa awk sprawdzić zduplikowane wartości w drugim polu, gdzie przez separator pól jest albo spacja lub kropka. Więc to jest to, co traktuje jako drugie pole:

$ awk -F'[. ]' '{ print $2 }' file 

gu 
gui 
guT 
gui 

W awk zmienna $0 reprezentuje całą linię, $1 reprezentuje pierwsze pole, i tak dalej ..

awk -F'[. ]' '{ if (a[$2]++ == 0) print }' opcje -F pozwalają określić separator pól, w tym przypadku jest to spacja lub kropka.

+0

hej @ sudo_O .. dziękuję ponownie. Czy możesz wyjaśnić, że rozkaz -awk jest mały? – teutara

0

Więc znalazłem to przez wszystkie potężne i niesamowite Google - Mój mały skrypt buduje odpowiedź @sudo_O, w tym, że pokazuje wszystkie znalezione duplikaty linii ...., a nie plik bez duplikatów.

Tekst I było znalezienie wszystkie duplikaty w kolumnie 3 (port) były w pliku o nazwie master.txt

 
awk '{if (a[$3]++ > 0) print}' master.txt | while read site thread port 
do 
    grep $port master.txt 
done 
Powiązane problemy