Bash Сравнение строк в каталоге - PullRequest
1 голос
/ 09 июня 2011

Привет, я пытаюсь сравнить две строки в каталоге. формат следующий.

{sametext}difference{sametext}.

Примечание: {sametext} не является статичным для каждого файла

например

myfile_1_exercise.txt по сравнению с myfile_2_exercise.txt

Можете ли вы сказать мне, как бы я соответствовал вышеуказанным строкам в операторе if.

По сути, мне нужно знать, как я проигнорирую число в двух строках, чтобы они были одинаковыми.

Ниже приведен пример кода:

Мой пример кода выглядит так:

for g in `ls -d */`;
do                      
  if [ -d $g ]; then 
    cd $g                 # down 1 directories
    for h in `ls *root`;
    do
      printf "${Process[${count}]} = ${basedir}/${f}${g}${h}\n"
      h1=${h}

      if [ "${h1}" = "${h2}" ]; then # NEED to MATCH SOME HOW??????????
        echo we have a match
      fi

      h2=${h1}
      let count+=1
    done

    cd ../
    #printf "\n\n\n\n"      
  fi
done

Каким должен быть тест, чтобы определить это вместо "${h1}" = "${h2}"?

Приветствия

Mike

Ответы [ 4 ]

3 голосов
/ 09 июня 2011
"myfile_1_exercise.txt" == "myfile_2_exercise.txt"

Вы имеете в виду, что приведенный выше тест должен вернуть true (игнорируя числа), верно?
Это то, что я бы сделал:

h1="myfile_1_exercise.txt"
h2="myfile_2_exercise.txt"
if [ $( echo ${h1} | sed 's/[0-9]*//g' ) == $( echo ${h2} | sed 's/[0-9]*//g' ) ] ; then 
    # do something here.
fi
3 голосов
/ 09 июня 2011

sed пригодится здесь.

Это в основном просматривает каждый файл в каталоге, извлекает две строки из имени файла и сохраняет список всех их уникальных комбинаций.

Затем он просматривает этот список и использует подстановочный знак bash, чтобы вы могли перебирать каждую коллекцию.

РЕДАКТИРОВАТЬ: избавился от уродливого взлома.

i=0
for f in *_*_*.txt
do
    a=`echo "$f" | sed 's/\(.*\)_.*_\(.*\).txt/\1/g'`
    b=`echo "$f" | sed 's/\(.*\)_.*_\(.*\).txt/\2/g'`

    tmp=${all[@]}
    expr match "$tmp" ".*$a:$b.*" >/dev/null
    if [ "$?" == "1" ]
    then
      all[i]="$a:$b"
      let i+=1
    fi
done

for f in ${all[@]}
do
    a=`echo "$f" | sed 's/\(.*\):\(.*\)/\1/g'`
    b=`echo "$f" | sed 's/\(.*\):\(.*\)/\2/g'`
    echo $a - $b
    for f2 in $a_*_$b.txt
    do
        echo "  $f2"
        # ...
    done
done

Конечно, это предполагает, что все файлы, которые вам нужны, следуют шаблону *_*_*.txt.

2 голосов
/ 09 июня 2011

Отказ от ответственности:

  1. Пробег может варьироваться, и вам может потребоваться настроить и отладить сценарий для угловых случаев.
  2. Возможно, вам лучше использовать Perl для своей задачи.
  3. Могут быть и лучшие решения даже в Bash.Этот не очень эффективен, но, похоже, работает.

Сказал, что вот скрипт, который сравнивает две строки в соответствии с вашими требованиями.Я уверен, что вы можете понять, как использовать его в своем скрипте со списком каталогов (кстати, вы можете рассмотреть find)

Этот скрипт принимает две строки и совпадает с отпечатками!если они совпадают

$ bash compare.sh myfile_1_exercise.txt myfile_2_exercise.txt
match!
$ bash compare.sh myfile_1_exercise.txt otherfile_2_exercise.txt
$

Сценарий:

#!/bin/bash
fname1=$1
fname2=$2

findStartMatch() {
  match=""
  rest1=$1 ;
  rest2=$2 ;
  char1=""
  char2=""
  while [[  "$rest1" != "" && "$rest2" != "" && "$char1" == "$char2" ]] ; do
    char1=$(echo $rest1 | sed 's/\(.\).*/\1/');
    rest1=$(echo $rest1 | sed 's/.\(.*\)/\1/') ;
    char2=$(echo $rest2 | sed 's/\(.\).*/\1/');
    rest2=$(echo $rest2 | sed 's/.\(.*\)/\1/') ;
    if [[ "$char1" == "$char2" ]] ; then
      match="${match}${char1}"
    fi
  done
}

findEndMatch() {
  match=""
  rest1=$1 ;
  rest2=$2 ;
  char1=""
  char2=""
  while [[  "$rest1" != "" && "$rest2" != "" && "$char1" == "$char2" ]] ; do
    char1=$(echo $rest1 | sed 's/.*\(.\)/\1/');
    rest1=$(echo $rest1 | sed 's/\(.*\)./\1/') ;
    char2=$(echo $rest2 | sed 's/.*\(.\)/\1/');
    rest2=$(echo $rest2 | sed 's/\(.*\)./\1/') ;
    if [[ "$char1" == "$char2" ]] ; then
      match="${char1}${match}"
    fi
  done
}

findStartMatch $fname1 $fname2
startMatch=$match
findEndMatch $fname1 $fname2
endMatch=$match

if [[ "$startMatch" != "" && "$endMatch" != "" ]] ; then
  echo "match!"
fi
0 голосов
/ 09 июня 2011

Если вы на самом деле сравниваете два файла, как вы упомянули ... возможно, вы можете использовать команду diff, например

diff myfile_1_exercise.txt myfile_2_exercise.txt
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...