두 개의 파일이 있습니다.
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
답변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