2010-11-16 4 views
1

Мне нужно сравнить две строки в оболочке Bourne той же фиксированной длины. Мне нужно сравнить каждый символ с владельцем места в противоположной строке и узнать, сколько там различий. У кого-нибудь есть предложения по тому, как это сделать?Bourne Shell сравнить две строки

Я только после того, как из числа различий т.е. если я сравнил AAB & ААСА различие было бы 1.

Это также должно быть 100% Борном.

+0

Вы должны сделать это в Bourne и не Bash? Что это за устаревшая система? –

+0

@Mark Thomas: Какой программист использовал бы бахизмы, когда решение bourne делает трюк? Кто все еще использует bash, когда есть zsh? Понимаете, все зависит от предпочтений и того, к чему вы привыкли, или от того, с чем работает ваша ОС. – Jens

ответ

0

Это, вероятно, ответ вы хотите ... Bash string difference

Использование cmp для сравнения двух строк (diff не даст вам уровень детализации вы хотите.)

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 
+0

Знайте, что в любом случае вытащить каждого персонажа в раковине Борна, извините, не может быть никакого удара. – Thomas

+0

Я обновил приведенный выше пример кода.У меня есть только Bash для меня на данный момент, но код передает совместимость с Bourne Bourne. –

+0

Двойные квадратные скобки недоступны в оболочке Бурна. –

1

Если вы не против создания временных файлов, вы можете использовать метод КСС. С оболочкой Bourne вы довольно ограничены тем, что можете сделать. Я бы либо использовал zsh/bash, либо sh был необходим, напишите программу C, которая сделала то, что я хочу.

Если вы создаете файлы каждый раз, когда не может быть и речи, вы можете создать fifos, но это действительно хакерский и уродливый, не делайте этого!

mkfifo cmp1 
mkfifo cmp2 
echo "abcd" > cmp1 & 
echo "abce" > cmp2 & 
DIFF_CHARS=`cmp -l cmp1 cmp2 | wc -l` 

Процесс замещения в Bash или любой современной оболочки делает это тривиально, и я бы определенно попытаться использовать это.

1

Это довольно чистая оболочка POSIX. Она работает в тире (как sh) и BusyBox Ash (как sh) и не использует внешние утилиты (если ваша оболочка не не имеет встроенной 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 , 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" 

Олди Но Гуди или Оригинальный Bourne дедуля

0

Для образовательных целей здесь используется чистое решение Bourne (и POSIX) без дополнительных вилок. POSIX оболочка может запускать это даже без вилки на все с COUNT=$((COUNT+1)):

#!/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 

Позволяет запустить это на струнах ора в:

$ ./x.sh aab aac 
COUNT=1 
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 
Смежные вопросы