diff gdzie linie są w większości takie same, ale nie w porządku?

23

Chcę różnicować dwa zestawy reguł mod_rewrite. Zbiór linii jest w około 90% identyczny, ale kolejność jest tak różna, że ​​diff w zasadzie mówi, że są zupełnie inne.

Jak mogę zobaczyć, które wiersze naprawdę różnią się między dwoma plikami, niezależnie od ich numeru?

użytkownik394
źródło
3
Przepuść ich przez sortpięść.
Shawn J. Goff,
@Shawn Czy mogę to zrobić bez tworzenia (i usuwania później) dwóch plików jednorazowych?
user394,

Odpowiedzi:

36

sortmożna użyć do uporządkowania plików, aby diffmóc je porównać i zidentyfikować różnice. Jeśli masz podstawianie procesów, możesz tego użyć i uniknąć tworzenia nowych posortowanych plików.

diff <(sort file1) <(sort file2)
Shawn J. Goff
źródło
8

Stworzono dla tego skrypt, który zachowuje nienaruszoną sekwencję linii . Oto adnotowana wersja ważnych wierszy:

# Strip all context lines
diff_lines="$(grep '^[><+-] ' | sed 's/^+/>/;s/^-/</')" || exit 0

# For each line, count the number of lines with the same content in the
# "left" and "right" diffs. If the numbers are not the same, then the line
# was either not moved or it's not obvious where it was moved, so the line
# is printed.
while IFS= read -r line
do
    contents="${line:2}"
    count_removes="$(grep -cFxe "< $contents" <<< "$diff_lines" || true)"
    count_adds="$(grep -cFxe "> $contents" <<< "$diff_lines" || true)"
    if [[ "$count_removes" -eq "$count_adds" ]]
    then
        # Line has been moved; skip it.
        continue
    fi

    echo "$line"
done <<< "$diff_lines"

if [ "${line+defined}" = defined ]
then
    printf "$line"
fi
l0b0
źródło