Sponsored Content
Full Discussion: Compare 2 Strings
Top Forums Shell Programming and Scripting Compare 2 Strings Post 302976964 by drl on Saturday 9th of July 2016 12:14:25 PM
Old 07-09-2016
Hi.

Here is an adaptation of a code from stackoverflow . It has a debugger so that you can see details of each sub-comparison, so it's really a verbose option that you can change in the code. I would probably do it a little differently, but this code is already completed and works as shown below:
Code:
#!/usr/bin/env bash

# @(#) s2       Demonstrate version strings comparison.

LC_ALL=C ; LANG=C ; export LC_ALL LANG
pe() { for _i;do printf "%s" "$_i";done; printf "\n"; }
pl() { pe;pe "-----" ;pe "$*"; }
db() { ( printf " db, ";for _i;do printf "%s" "$_i";done;printf "\n" ) >&2 ; }
db() { : ; }
C=$HOME/bin/context && [ -f $C ] && $C

FILE=${1-data1}

pl " Input data file $FILE:"
head $FILE

pl " Version comparison script:"
cat vercomp

# Compare, look at exit status.
# return 1 for $1 > $2
# return 2 for $1 < $2
# return 0 for equal

pl " Results:"
while read v1 v2
do

./vercomp "$v1" "$v2"
v0=$?
case $v0 in
        (0) pe " Versions $v1 and $v2 are the equal." ;;
        (1) pe " $v1 is more recent than $v2." ;;
        (2) pe " $v2 is more recent than $v1." ;;
        (*) pe " Internal error." ;;
esac
done < $FILE

exit 0

producing:
Code:
$ ./s2

Environment: LC_ALL = C, LANG = C
(Versions displayed with local utility "version")
OS, ker|rel, machine: Linux, 3.16.0-4-amd64, x86_64
Distribution        : Debian 8.4 (jessie) 
bash GNU bash 4.3.30

-----
 Input data file data1:
V_1_4_4_b1      V_1_5_1_RC_b1
1.2-r3  1.2-r4
1.2rc3  1.2r4
3.14a   3.14b

-----
 Version comparison script:
#!/usr/bin/env bash

# @(#) vercomp  Compare version strings.
# Adapted from:
# http://stackoverflow.com/questions/4023830/bash-how-compare-two-strings-in-version-format

ascii_frag() {
  expr match "$1" "\([^[:digit:]]*\)"
}

ascii_remainder() {
  expr match "$1" "[^[:digit:]]*\(.*\)"
}

numeric_frag() {
  expr match "$1" "\([[:digit:]]*\)"
}

numeric_remainder() {
  expr match "$1" "[[:digit:]]*\(.*\)"
}

# Disable/enable debugging here.
vercomp_debug() {
  OUT="$1"
  # echo "${OUT}" >&2
}

# return 1 for $1 > $2
# return 2 for $1 < $2
# return 0 for equal
vercomp() {
  local WORK1="$1"
  local WORK2="$2"
  local NUM1="", NUM2="", ASCII1="", ASCII2=""
  while true; do
    vercomp_debug "ASCII compare"
    ASCII1=`ascii_frag "${WORK1}"`
    ASCII2=`ascii_frag "${WORK2}"`
    WORK1=`ascii_remainder "${WORK1}"`
    WORK2=`ascii_remainder "${WORK2}"`
    vercomp_debug "\"${ASCII1}\" remainder \"${WORK1}\""
    vercomp_debug "\"${ASCII2}\" remainder \"${WORK2}\""
    
    if [ "${ASCII1}" \> "${ASCII2}" ]; then
      vercomp_debug "ascii ${ASCII1} > ${ASCII2}"
      return 1
      elif [ "${ASCII1}" \< "${ASCII2}" ]; then
      vercomp_debug "ascii ${ASCII1} < ${ASCII2}"
      return 2
    fi
    vercomp_debug "--------"
    
    vercomp_debug "Numeric compare"
    NUM1=`numeric_frag "${WORK1}"`
    NUM2=`numeric_frag "${WORK2}"`
    WORK1=`numeric_remainder "${WORK1}"`
    WORK2=`numeric_remainder "${WORK2}"`
    vercomp_debug "\"${NUM1}\" remainder \"${WORK1}\""
    vercomp_debug "\"${NUM2}\" remainder \"${WORK2}\""
    
    if [ -z "${NUM1}" -a -z "${NUM2}" ]; then
      vercomp_debug "blank 1 and blank 2 equal"
      return 0
      elif [ -z "${NUM1}" -a -n "${NUM2}" ]; then
      vercomp_debug "blank 1 less than non-blank 2"
      return 2
      elif [ -n "${NUM1}" -a -z "${NUM2}" ]; then
      vercomp_debug "non-blank 1 greater than blank 2"
      return 1
    fi
    
    if [ "${NUM1}" -gt "${NUM2}" ]; then
      vercomp_debug "num ${NUM1} > ${NUM2}"
      return 1
      elif [ "${NUM1}" -lt "${NUM2}" ]; then
      vercomp_debug "num ${NUM1} < ${NUM2}"
      return 2
    fi
    vercomp_debug "--------"
  done
}

vercomp "$@"

-----
 Results:
 V_1_5_1_RC_b1 is more recent than V_1_4_4_b1.
 1.2-r4 is more recent than 1.2-r3.
 1.2rc3 is more recent than 1.2r4.
 3.14b is more recent than 3.14a.

I tested it as shown, which is not extensively, only to see if it seems to basically work.

Best wishes ... cheers, drl
 

10 More Discussions You Might Find Interesting

1. Shell Programming and Scripting

to compare two strings

hi all, i am new to unix. Actually i need to compare two string and print the result... suppose type='sun' if; then echo good morning else echo good night fi whether the comparison is right r we need to use eq???? help me please.... :confused: thanks in advance.... (1 Reply)
Discussion started by: ithirak17
1 Replies

2. Shell Programming and Scripting

How to compare two strings

Hi all, I am trying to compare two strings/dates, but its throwing error::Syntax error at line 5: Please help !! Any alternate way to compare two dates is also fine.... logdate1=`date -u '+%Y.%m.%d %T'` sleep 5 logdate2=`date -u '+%Y.%m.%d %T'` if test... (5 Replies)
Discussion started by: prashant43
5 Replies

3. Shell Programming and Scripting

How to compare two strings using if

Hi, Here is my script #!/bin/ksh echo $pick_typ if ];then echo "inside if" else echo "outside if" fi when ever i pass CUS as parameter to this script am getting the correct value CUS, however if i pass ORD as parameter it is not coming inside if it is echoing else "Outside... (12 Replies)
Discussion started by: bhargav20
12 Replies

4. Shell Programming and Scripting

Compare text strings.

Hi Im trying to write a script that compare a text string. But it fails, I think it adds a extra line feed to the result and fails beacuse of that. The script. DT=`date +'%Y%m%d%H%M%S'` #ALARM_BIN=/users/alarms/ssa/alarms/bin QUEUE_THR=10 #unset offset #offset="***Server reports data... (3 Replies)
Discussion started by: vettec3
3 Replies

5. Shell Programming and Scripting

How to Compare 2 Strings ?

Hello , I want to Compare with 2 strings and get if they are True or not please would like some help on this #!bin/ksh echo "Enter Name 1" read Name1 echo "Enter Name 2" read Name2 echo "------------------------" echo "First Name: $Name1" echo "Second Name: $Name2" echo... (25 Replies)
Discussion started by: shatztal
25 Replies

6. Shell Programming and Scripting

Compare two strings

hi.. i have a problem to compare two string my code is like that if ] then echo "both data are correct" elif ] echo "data is wrong" fi here $username1 is taking value from file.. (7 Replies)
Discussion started by: shubhig15
7 Replies

7. Shell Programming and Scripting

How to compare two strings in a file

hello guyzz please help me out.. I have two file a.sh and b.sh it contains two string SD109 ,SD108 . I want to compaere these two string . If a.sh>b.sh do rebasing record time. else it shows no rebasing required. Thanks. (2 Replies)
Discussion started by: abhijtr
2 Replies

8. Shell Programming and Scripting

Compare strings with space in if statement

DEV> vi test_if_statement.sh "test_if_statement.sh" 9 lines, 205 characters proc_out="Normal completion" proc_out_comp="Normal completion" echo 'proc_out:'$proc_out echo 'proc_out_comp:'$proc_out_comp if then echo 'match' else echo 'no_match' fi ~ ~ ~ ~ ~ ~ ~ ~ ~ (4 Replies)
Discussion started by: cartrider
4 Replies

9. UNIX for Beginners Questions & Answers

If statement to compare two strings

Hi, I am trying to do the following to see if "ip" is already present in a file. if ; then echo "hi" else echo "hello" fi I am seeing errors on the if statement. Can someone please correct the syntax for me? Thanks (2 Replies)
Discussion started by: waince
2 Replies

10. Ubuntu

Compare 2 strings

I think there is a way to detect mouse movement. valuator changes if the mouse moves. So I need to compare the two strings. Not sure how to do that. How could I send the valuator string to a file ? I would need to do it twice. andy@7_~/Downloads$ xinput query-state 9 2 classes :... (7 Replies)
Discussion started by: drew77
7 Replies
All times are GMT -4. The time now is 05:43 AM.
Unix & Linux Forums Content Copyright 1993-2022. All Rights Reserved.
Privacy Policy