2013-03-18 15 views
10

Z terminalu unix możemy użyć diff file1 file2, aby znaleźć różnicę między dwoma plikami. Czy istnieje podobne polecenie pokazujące podobieństwo między 2 plikami? (Wiele rur dozwolone, jeśli to konieczneJak znaleźć zduplikowane linie w 2 różnych plikach? Unix

Każdy plik zawiera linię zdaniu smyczkową; są one sortowane i powielać wiersze usunięte z sort file1 | uniq

file1.. http://pastebin.com/taRcegVn

file2: http://pastebin.com/2fXeMrHQ

I dane wyjściowe powinny wyprowadzać linie, które pojawiają się w obu plikach:

output: http://pastebin.com/FnjXFshs

jestem w stanie używać python to zrobić jako taki, ale myślę, że to trochę za dużo, aby umieścić w terminalu:

x = set([i.strip() for i in open('wn-rb.dic')]) 
y = set([i.strip() for i in open('wn-s.dic')]) 
z = x.intersection(y) 
outfile = open('reverse-diff.out') 
for i in z: 
    print>>outfile, i 
+0

Czego pliki wyglądać? – paulmelnikow

+3

możliwy duplikat [jak wyświetlać wspólne linie (odwrócone różnice)?] (Http://stackoverflow.com/questions/746458/how-to-show-lines-in-common-reverse-diff) – tjameson

+0

Najwięcej razy ciąg zdań w języku ludzkim. Czasami jest również wzbogacany o więcej informacji. – alvas

Odpowiedz

9

Jak @tjameson wspomniano może być rozwiązany w innym wątku. Wystarczy chciałby pisać inne rozwiązanie: sort file1 file2 | awk 'dup[$0]++ == 1'

  1. odnieść do awk guide dostać jakieś awk podstawy, gdy wartość wzorca linii jest prawdziwe ta linia będzie drukowane

  2. dup [ $ 0] jest tablicą mieszającą, w której każdy klucz jest w każdym wierszu wejścia, oryginalna wartość wynosi 0 i wzrasta po wystąpieniu tej linii, gdy ponownie występuje, wartość powinna wynosić 1, więc dup[$0]++ == 1 jest prawdziwa. Następnie ta linia zostanie wydrukowana.

Należy zauważyć, że działa to tylko wtedy, gdy w żadnym z plików nie ma duplikatów, jak określono w pytaniu.

+0

Czy możesz wyjaśnić, jak działa 'awk 'dup [$ 0] ++ == 1''?Twoje rozwiązanie jest znacznie lepsze niż mylące 'comm' – alvas

+0

@ 2er0 odpowiedź jest aktualizowana –

+1

' awk' używa 'wzorzec {akcja}' notacja. Ponieważ nie jest to w nawiasach klamrowych, jest to wzorzec. '$ 0' jest bieżącym wierszem. 'dup [$ 0]' jest tablicą asocjacyjną indeksowaną przez linie; po pierwszym utworzeniu wartość wynosi 0; 'dup [$ 0] ++' po inkrementacji wartości, więc zwraca 0 za pierwszym razem, i 1 po raz drugi, itd. Gdy jego wartość wynosi 1, warunek jest prawdziwy, więc domyślna akcja (wydrukuj linię) jest wykonywany. –

24

Jeśli chcesz uzyskać listę powtarzających się linii, bez uciekania się do AWK, można użyć -d flag to uniq:

sort file1 file2 | uniq -d 
+1

Za używanie najprostszego narzędzia do osiągnięcia celu. –

+0

Upuszczając również -d dostajesz tylko wszystkie wyraźne linie z obu plików, czego właśnie szukałem. – Aaron

Powiązane problemy