Как сравнить два файла в сценарии оболочки?

Вот мой сценарий. У меня есть два файла, которые имеют записи с 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 ответа

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

diff file1 file2 > whats_the_diff.txt

Если вы не пишете скрипт для переносимости в исходную оболочку 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 использует позиции символов для начала и конца диапазона, в то время как эта конструкция оболочки использует начальную позицию и количество символов, поэтому вы должны соответствующим образом скорректировать числа.

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

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

if [ "$d" != NULL ];

Пытаться.

Другие вопросы по тегам