Как сравнить два файла в сценарии оболочки? - PullRequest
0 голосов
/ 09 октября 2009

Вот мой сценарий. У меня есть два файла, которые имеют записи с 3-25 символов каждой записи является идентификатором. Исходя из этого, мне нужно сравнить их оба и обновить старый файл новыми данными файла, если их идентификаторы совпадают. Идентификаторы начинаются с 01. Пожалуйста, посмотрите на скрипт ниже. Это приводит к некоторой ошибке как «аргумент, ожидаемый в строке 12, который я не могу понять.

#!/bin/ksh
while read line
  do
    c=`echo $line|grep '^01' `
    if [ $c -ne NULL ];
      then
        var=`echo $line|cut -c 3-25`
    fi
    while read i
      do
        d=`echo $i|grep '^01' `
        if [ $d -ne NULL ];
          then
            var1=`echo $i|cut -c 3-25`
            if [ $var -eq $var1 ];
              then
                $line=$i
            fi
        fi
      done < test_monday
  done < test_sunday

Пожалуйста, помогите мне заранее спасибо

Ответы [ 3 ]

1 голос
/ 09 октября 2009

Если вы не пишете скрипт для переносимости в исходную оболочку Bourne или другие, которые не поддерживают эту функцию, в Bash и ksh вы должны использовать форму [[ теста для строк и файлов.

Уменьшается необходимость в цитировании и экранировании, дополнительные условия, такие как сопоставление с образцом и регулярным выражением, а также возможность использовать && и || вместо -a и -o.

if [[ $var == $var1 ]]

Кроме того, «NULL» не является специальным значением в Bash и ksh, и поэтому ваш тест всегда будет успешным, поскольку $d проверяется с использованием буквенной строки «NULL».

if [[ $d != "" ]]

или

if [[ $d ]]

Для числовых значений (не считая начальных нулей, если вы не используете восьмеричное), вы можете использовать числовые выражения. Вы можете опустить знак доллара для переменных в этом контексте.

numval=41
if ((++numval >= 42))  # increment then test
then
    echo "don't panic"
fi

Нет необходимости использовать echo и cut для подстрок. В Bash и Ksh вы можете сделать:

var=${line:3:23}

Примечание: cut использует позиции символов для начала и конца диапазона, в то время как эта конструкция оболочки использует начальную позицию и количество символов, поэтому вам необходимо соответствующим образом скорректировать числа.

И это хорошая идея отказаться от использования обратных галочек . Вместо этого используйте $(). Это может быть вложенным, а цитирование и экранирование уменьшены или упрощены.

1 голос
/ 09 октября 2009

Я думаю, что вам нужно:

if [ "$d" != NULL ];

Try.

0 голосов
/ 09 октября 2009

Я думаю, вы могли бы использовать команду DIFF

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