Jak odróżnić tylko pierwszą linię dwóch plików?

17

Chcę różnicować tylko pierwszy wiersz dwóch plików, w przeciwieństwie do całego pliku. Jak mam to zrobić? Potrzebuję tylko rozwiązania dla pierwszego wiersza, ale jeśli możesz podać liczbę wierszy, byłaby to znacznie lepsza odpowiedź.

Więc diff nie zwróci żadnych różnic między następującymi dwoma plikami:

a
1
2

i:

a
3
4
gsingh2011
źródło
czy to zadziałało dla ciebie ...?
nerdwaller
@nerdwaller Tak, zaakceptowano.
gsingh2011,
fajna fasola. Próbowałem wymyślić inne opcje, na szczęście nie jest to konieczne.
nerdwaller

Odpowiedzi:

26

Proszę bardzo:

diff <(head -n 1 file1) <(head -n 1 file2)

(to nie zwróciłoby nic takiego).

diff <(head -n 2 file1) <(head -n 2 file2)

Returns:
2c2
< 1
---
> 3

Możesz włączyć to do skryptu, aby robić rzeczy, o których wspominasz.

#!/bin/bash

fileOne=${1}
fileTwo=${2}
numLines=${3:-"1"}

diff <(head -n ${numLines} ${fileOne}) <(head -n ${numLines} ${fileTwo})

Aby tego użyć, po prostu ustaw skrypt na wykonywalny, chmod +x nameofscript.sha następnie wykonaj, ./nameofscript.sh ~/file1 ~/Docs/file2co pozostawia domyślną liczbę wierszy na 1, jeśli chcesz więcej, dodaj liczbę na końcu tego polecenia.

(Lub możesz zrobić przełączniki w swoim skrypcie z opcją -f1 plik1 -f2 plik2 -n 1, ale nie przypominam sobie z góry instrukcji przypadku).

headzwraca od początku liczbę wierszy zgodnie z sugestią -n. Gdybyś chciał zrobić odwrotnie, byłoby to tail -n ${numLines}(ogon robi od końca wstecz liczbę linii).

Edytuj 5/10/16:

Jest to specyficzne dla Bash (i kompatybilnych powłok). Jeśli musisz użyć tego z czegoś innego:

bash -c 'diff <(...) <(...)'
nerdwaller
źródło
Jak miałoby to działać dla różnic rekurencyjnych, kiedy muszę różnicować dwa katalogi?
lanoxx
@lanoxx diff -r dir1 dir2dla katalogów, aby to ograniczyć, prawdopodobnie będziesz chciał powiązać to z czymś innym. Jeśli masz jakieś szczegóły, otwórz nowe pytanie i podaj link tutaj.
nerdwaller
Cóż, w zasadzie to samo pytanie tylko rekurencyjnie: Zróżnicuj tylko (pierwsze n linii | wszystko oprócz pierwszych n linii) dla wszystkich plików w dwóch katalogach.
lanoxx,
@lanoxx, jak powiedziałem, zrób nowe pytanie i połącz je. Jest to najlepsza praktyka dla społeczności super użytkowników, zamiast rozszerzania zakresu pytań innych użytkowników.
nerdwaller
1
@ Veridian Jakiej powłoki używasz? Jest to specyficzne dla bash, więc możesz potrzebować zadzwonićbash -c "diff <(...) <(...)"
nerdwaller
-1

diff -U (n linii) plik1 plik2

Andress
źródło
1
Witamy w Super User! Czy możesz trochę rozwinąć -Uargument? :)
bertieb