我正在比较两个字符串并捕获共同部分,例如
FILE0000010985.LOG
FILE0000010999.LOG
FILE0000011000.LOG
如果我比较 1 和 2,我希望输出为
FILE00000109
,但如果我比较 1 和 3,输出将少 2 个字符FILE000001
它捕获了我认为的公共前缀,但字符串对我来说是未知的,所以它不仅仅是使用 Bash 的子字符串匹配功能等那么简单。
答案1
纯 bash 解决方案。请注意,1 和 2 的输出是 FILE00000109,而不是 FILE0000010。
#!/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}"
(如果文件可能相同,则必须添加额外的测试。)