Как сравнить два файла в сценарии оболочки?
Вот мой сценарий. У меня есть два файла, которые имеют записи с 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
использует позиции символов для начала и конца диапазона, в то время как эта конструкция оболочки использует начальную позицию и количество символов, поэтому вы должны соответствующим образом скорректировать числа.
И это хорошая идея, чтобы избежать использования обратных галочек. использование $()
вместо. Это может быть вложенным, и цитирование и экранирование уменьшаются или упрощаются.