我需要比较相同固定长度的Bourne shell中的两个字符串。我需要将每个字符与相对字符串中的占位符进行比较,并找出存在多少差异。有没有人对如何解决这个问题有任何建议?
我只是在追逐一些差异,即如果我比较aab& aac的差异将是1。
这也必须是100%的bourne。
答案 0 :(得分:1)
有很多方法可以实现您所寻求的目标(我知道),但以下代码片段应该可以帮助您开始:
STRING1="test"
STRING2="te5t"
COUNT=0
while [[ $COUNT -lt ${#STRING1} ]]
do
POS=$(($COUNT + 1))
char1=$(echo "${STRING1}" | cut -c $POS)
char2=$(echo "${STRING2}" | cut -c $POS)
if [ $char1 != $char2 ]; then
echo $char1
echo $char2
fi
COUNT=$(($COUNT + 1))
done
答案 1 :(得分:1)
如果您不介意创建临时文件,可以使用cmp方法。使用Bourne shell,您可以做的事情非常有限。我要么使用zsh / bash,要么sh是必不可少的,写一个做我想做的C程序。
如果每次创建文件都是不可能的,你可以创建fifos,但这真的是hackish和丑陋,不要这样做!
mkfifo cmp1
mkfifo cmp2
echo "abcd" > cmp1 &
echo "abce" > cmp2 &
DIFF_CHARS=`cmp -l cmp1 cmp2 | wc -l`
Bash或任何现代shell中的进程替换使得这很简单,我肯定会尝试使用它。
答案 2 :(得分:1)
这是非常纯粹的POSIX shell。它在Dash(作为sh
)和BusyBox Ash(作为sh
)中运行,并且不使用任何外部实用程序(除非您的shell没有内置printf
):
#!/bin/sh
string1="compare"
string2="c0mp4r3"
count=0
while [ -n "$string1" ]
do
char1=$(printf "%1.1s" "$string1")
char2=$(printf "%1.1s" "$string2")
if [ "$char1" != "$char2" ]
then
count=$(($count + 1))
fi
string1=${string1#$char1}
string2=${string2#$char2}
done
echo "There are $count differences"
这将在OBG 1 上运行,Heirloom Bourne Shell:
#!/usr/local/heirloom-bin/sh
string1="compare"
string2="c0mp4r3"
count=0
while [ -n "$string1" ]
do
char1=`printf "%1.1s" "$string1"`
char2=`printf "%1.1s" "$string2"`
if [ "$char1" != "$char2" ]
then
count=`expr $count + 1`
fi
string1=`echo "$string1" | cut -c 2-`
string2=`echo "$string2" | cut -c 2-`
done
echo "There are $count differences"
1 Oldie但Goody 或 Original Bourne Granddaddy
答案 3 :(得分:1)
awk '{gsub(/[^[:alnum:]_[:blank:]]/, "", $0);for (i = 1; i <= NF; i++) {freq[$i]++}} END {for (word in freq){printf "%d\t%s\n", freq[word],word}}' {file} | sort -nr
答案 4 :(得分:0)
这可能是你想要的答案...... Bash string difference
使用cmp
比较两个字符串(diff
将无法提供您想要的详细程度。)
答案 5 :(得分:0)
出于教育目的,这里是一个纯粹的Bourne(和POSIX)解决方案,没有额外的分支。即使没有COUNT=$((COUNT+1))
的任何分支,POSIX shell也可以运行它:
#!/bin/sh
a=$1 b=$2
COUNT=0
while [ -n "$a" ]; do
[ "${a%${a#?}}" != "${b%${b#?}}" ] && COUNT=`expr $COUNT + 1`
a=${a#?} b=${b#?}
done
echo COUNT=$COUNT
让我们在OP的字符串上运行:
$ ./x.sh aab aac
COUNT=1