두 문자열 사이의 공통 문자를 캡처하는 방법

두 문자열 사이의 공통 문자를 캡처하는 방법

두 문자열을 비교하고 다음과 같은 공통 부분을 캡처합니다.

  • FILE0000010985.LOG
  • FILE0000010999.LOG
  • FILE0000011000.LOG

1과 2를 비교하면 출력이 되기를 원 FILE00000109하지만, 1과 3을 비교하면 출력이 2자 적어집니다.FILE000001

그것은 내가 생각하는 공통 접두사를 포착하지만 문자열은 나에게 알려지지 않았으므로 Bash의 하위 문자열 일치 기능 등을 사용하는 것만 큼 간단하지 않습니다.

답변1

순수한 bash 솔루션. 1과 2의 출력은 FILE0000010이 아니라 FILE00000109입니다.

#!/bin/bash
arr=(FILE0000010985.LOG
     FILE0000010999.LOG
     FILE0000011000.LOG
    )
for (( i=0; i<${#arr[@]}; ++i )) ; do
    for (( j=i + 1; j<${#arr[@]}; ++j )) ; do
        x=${arr[i]}
        y=${arr[j]}
        p=0
        while [[ ${x:0:p} == ${y:0:p} ]] ; do 
            (( ++p ))
        done
        echo $x $y : ${x:0:p-1}
    done
done

답변2

두 번째 행부터 시작하여 각 행을 이전 행과 비교하려면 다음을 수행하십시오.

awk '
    NR==1{
        split($0,U,"")
        next}
    {
        s=split($0,A,"")
        f=1
        if(length(U)>s)
            s=length(U)
        for(i=1;i<=s;i++)
            if(A[i]==U[i]&&f!=0)
                printf("%s",A[i])
            else {
                f=0
                U[i]=A[i]}
        print ""}
'

답변3

두 파일이 확실히 다른 경우 한 가지 가능성은 다음과 같습니다.

f1=FILE0000010985.LOG
f2=FILE0000010999.LOG

for ((l=0; l<${#f1}; l++))
do [[ ${f1:0:l} != "${f2:0:l}" ]] && break
done
printf "%s\n" "${f1:0:l-1}"

(파일이 동일할 가능성이 있는 경우 추가 테스트를 추가해야 합니다.)

관련 정보