2011-08-05 12 views
12

mogę to zrobić w Pythonie, ale zastanawiałem się, czy mogę to zrobić w Linuksieznalezienie unikalne wartości w pliku danych

Mam pliku jak ten

name1 text text 123432re text 
name2 text text 12344qp text 
name3 text text 134234ts text 

Chcę znaleźć wszystko różne typy wartości w trzeciej kolumnie przez konkretną nazwę użytkownika, powiedzmy, imię 1.

grep nazwa1 nazwa pliku daje mi wszystkie linie, ale musi być jakiś sposób, aby wyświetlić listę wszystkich różnych typów wartości? (Nie chcę, aby wyświetlić zduplikowane wartości dla tej samej nazwie)

Odpowiedz

30
grep name1 filename | cut -d ' ' -f 4 | sort -u 

ten znajdzie wszystkie linie, które mają NAME1, a następnie dostać tylko czwartą kolumnę danych i pokazać tylko unikatowe wartości.

+1

Jeśli masz 'name1' w innym polu lub użytkownika o nazwie' name1foo', rozwiązanie może dać wyniki, których nie chcesz. Chciałbym grep na '"^name1 "' (z spacją po nazwie1), aby tego uniknąć. – jfg956

7

Można pozwolić sortowania patrzeć tylko na klucz 4-go, a następnie zadać tylko dla rekordów z unikatowych kluczy:

grep name1 | sort -k4 -u 
1

Jako rozwiązanie awk all-in-one:

awk '$1 == "name1" && ! seen[$1" "$4]++ {print $4}' filename 
4

próbowałem za pomocą cat

plik zawiera: (tutaj plik jest foo.sh można wprowadzić dowolną nazwę pliku tutaj)

$cat foo.sh

tar 
world 
class 
zip 
zip 
zip 
python 
jin 
jin 
doo 
doo 

uniq dostanie każde słowo tylko raz

$ cat foo.sh | sort | uniq

class 
doo 
jin 
python 
tar 
world 
zip 

uniq -u dostanie słowo pojawiło tylko raz w pliku

$ cat foo.sh | sort | uniq -u

class 
python 
tar 
world 

uniq -d dostanie tylko duplikaty słów i wydrukować je jeden raz

$ cat foo.sh | sort | uniq -d

doo 
jin 
zip 
0

Moim zdaniem, trzeba wybrać pole z którego potrzebujesz unikalnych wartości. Próbowałem pobrać unikalne źródłowe adresy IP z dziennika IPTables.

cat /var/log/iptables.log | grep "May 5" | awk '{print $11}' | sort -u 

Oto wynik powyższego polecenia:

SRC=192.168.10.225 

SRC=192.168.10.29 

SRC=192.168.20.125 

SRC=192.168.20.147 

SRC=192.168.20.155 

SRC=192.168.20.183 

SRC=192.168.20.194 

więc najlepszym pomysłem jest, by wybrać pole, a następnie odfiltrować unikalne dane.

+0

Zarówno 'cat' jak i' grep | awk są [bezużyteczne] (http://www.iki.fi/era/unix/award.html). Dowolny 'cat a | grep b | awk '{c}' 'jest lepiej przeformułowany jako' awk '/ b/{c}' a' – tripleee

Powiązane problemy