2013-03-13 13 views
20

Mam dwa pliki A1 i A2 (nieposortowane). A1 to poprzednia wersja A2 i niektóre linie zostały dodane do A2. Jak mogę uzyskać nowe linie dodane do A2?Jak uzyskać różnicę (tylko dodatki) między dwoma plikami w Linuksie

Uwaga: chcę tylko dodać nowe linie i nie chcę linii, które były w A1, ale usunięte w A2. Kiedy robię diff A1 A2, dostaję dodatki, a także usunięcia, ale chcę tylko dodatki.

Proszę zasugerować sposób, aby to zrobić.

+0

są wszystkie dodane linie w A2 nowe dla pliku? Mam na myśli brak duplikatów z istniejącymi liniami? – Kent

+0

@kent no duplicates – user1004985

Odpowiedz

25

diff a następnie grep dla żądanego rodzaju edycji.

diff -u A1 A2 | grep -E "^\+" 
+2

To sprawi, że '+' na początku wiersza – kgadek

5

Można wpisać:

grep -v -f A1 A2 
+0

załóżmy, że plik 'A1' zawiera jedną linię' x', a plik 'A2' zawiera jedną linię' x' i drugą linię 'xx '. Ta komenda nic nie daje, ponieważ obie linie w 'A2' zawierają' x'. – timrau

19

Można spróbuj tego

diff --changed-group-format = '%>' --unchanged-group-format = '' A1 A2

+4

Czy możesz wyjaśnić te opcje, nie mogłem uzyskać ich od strony man? – user1004985

+2

Zobacz ten link więcej gnu [formaty grup linii] (http://www.gnu.org/software/diffutils/manual/html_node/Line-Group -Formats.html) – merp

16

Wszystko poniżej są kopiowane bezpośrednio z @ TomOnTime za ServerFault odpowiedź here:

Pokaż linie, które istnieją tylko w pliku a: (np. co został usunięty z)

comm -23 a b 

Pokaż linie, które istnieją tylko w pliku B: (czyli to, co zostało dodane do B)

comm -13 a b 

Pokaż linie, które istnieją tylko w jednym pliku lub inny: (ale nie oba)

comm -3 a b | sed 's/^\t//' 

(Uwaga: Jeśli plik a ma linii, które zaczynają zakładce (pierwszy TAB). zostanie usunięty z wyjścia)

UWAGA: Oba pliki należy posortować, aby "comm" działał prawidłowo. Jeśli nie są już klasyfikowane, należy je posortować:

sort <a >a.sorted 
sort <b >b.sorted 
comm -12 a.sorted b.sorted 

Jeśli pliki są bardzo długo, może to być sporym obciążeniem, ponieważ wymaga dodatkowej kopii, a więc dwa razy więcej miejsca na dysku.

Edit: pamiętać, że polecenie może być napisany bardziej zwięźle stosując podstawienie procesu (dzięki @phk dla komentarzu):

comm -12 <(sort < a) <(sort < b) 
+1

Ponieważ mówimy tu o 'bash', ostatnie polecenie można uprościć do' comm -12 <(sort phk

+0

@phk dzięki, zaktualizowany. – scottkosty

4
git diff path/file.css | grep -E "^\+" | grep -v '+++ b/' | cut -c 2- 
  • grep -E "^\+" z poprzedniej odpowiedzi jest przyjęte, że jest niekompletny ponieważ pozostawia rzeczy inne niż źródłowe
  • grep -v '+++ b' usuwa linię inną niż źródłowa z nazwą pliku późniejszej wersji
  • cut -c 2- r emoves kolumna + znaków, również mogą korzystać sed 's/^\+//'

comm lub sdiff nie były opcją powodu git.

+0

Najlepsza odpowiedź! Zwraca dokładnie te linie, które zostały dodane i nic więcej. To powinna być akceptowana odpowiedź, jak sądzę –

Powiązane problemy