쉘 스크립트를 사용하여 서로 다른 두 파일의 일대일 줄 비교

쉘 스크립트를 사용하여 서로 다른 두 파일의 일대일 줄 비교

두 개의 파일이 있습니다.

File1         File2

abc           abc
cde           cde,xyz,efg,hij,...,n

efg           lmn,opq,weq,...n

이제 비교하고 싶습니다.파일 1 줄 1그리고파일 2 라인 1,2호선그리고2호선등. 그러나 File2에서는 단일 행에 "쉼표"로 구분된 여러 항목이 포함될 수 있습니다.

이제 들어가보면파일 1해당 줄 항목과 일치합니다.파일 2결과는 좋을 것입니다. 그렇지 않으면 차이가 나타납니다.

예를 들어:

File1         File2

cde           cde,xyz,efg,hij,opt

cde두 파일 모두에 결과가 있으므로 결과는 양호해야 합니다 .

항목 차이점을 포함하여 diff와 같은 쉘 스크립트를 작성하는 데 도움을 줄 수 있습니까?

답변1

예쁘지는 않을 수도 있지만 다음과 같은 것이 시작일 수 있습니다.

# 1. Read lines from file1 as string, and file2 as comma-separated array.
while read -r a && IFS=, read -ra b <&3; do
    # 2. If both empty lines, continue.
    if [[ "$a" == "" && ${#b[@]} == 0 ]]; then
        continue
    fi
    # 3. Start assuming diff.
    diff=1
    # 4. Loop fields in $b.
    for e in ${b[@]}; do
        # Compare field in $b with $a, if match then abort.
        if [[ "$e" == "$a" ]]; then
            diff=0
            break
        fi
    done
    # 5. If no match found, print line from $b.
    if [[ $diff == 1 ]]; then
        # Join array with <space>comma.
        line=$(printf ", %s" "${b[@]}")
        # Print line, excluding leading <space>comma.
        printf "%s\n" "${line:2}"
    fi
# Input argument one as file 1 to stdin, and argument two as file 2 to
# file descriptor 3.
done < "$1" 3<"$2"

일반적으로 다음과 같이 사용됩니다.

$ ./myscript file1 file2

이제 Python, Perl, awk 등을 사용하는 것이 더 나을 것입니다.

답변2

아마도 이 스택 오버플로 답변이 올바른 방향으로 안내할 것입니다.

  1. Bash에서 파일 내용을 반복하시겠습니까?
  2. Bash에 포함된 문자열

대부분의 경우 각 파일의 각 행을순환 목록또는대량으로, 첫 번째 제안을 사용하세요. 그런 다음 동시에 반복하고 두 번째 제안을 사용하여 문자열을 비교합니다.

답변3

노력하다:

paste file1 file2 | grep -vP '^(.*)\t.*\1.*'

그리고 상황에 맞게 정규식을 조정할 수도 있습니다.

답변4

GNU awk를 사용하면 한 줄로 할 수 있습니다:

awk '{a=$0;getline <File2;if($0 ~ a)print "OK"; else print a,$0}' File1

관련 정보