라인이 대부분 동일하지만 순서가 다른 곳은 어디입니까?


23

두 세트의 mod_rewrite 규칙을 비교하고 싶습니다. 라인 세트는 약 90 % 동일하지만 순서가 너무 다르므로 diff는 기본적으로 완전히 다릅니다.

줄 번호에 관계없이 두 파일간에 어떤 줄이 다른지 어떻게 알 수 있습니까?


3
sort주먹을 통해 둘 다 전달하십시오 .
Shawn J. Goff

@Shawn 두 개의 일회성 파일을 생성 (및 나중에 삭제하지 않고) 할 수 있습니까?
user394

답변:


36

sort파일을 동일한 순서로 가져 오는 데 사용할 수 있으므로 파일을 diff비교하고 차이점을 식별 할 수 있습니다. 프로세스 대체가있는 경우이를 사용하여 새 정렬 파일을 작성하지 않아도됩니다.

diff <(sort file1) <(sort file2)

8

라인 순서를 그대로 유지 하는 스크립트작성 했습니다 . 다음은 중요한 행의 주석이 달린 버전입니다.

# 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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.