2009-10-09 2 views
0

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

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

+0

@ ALN, не могли бы вы также разместить некоторые данные образца, чтобы было легче понять требование. Спасибо – Vijay

+0

Если вы разместите данные некоторых образцов, вы можете получить не только решение для сценариев оболочки, но и еще несколько простых решений, сценарий оболочки либо AWK, SED, Perl и т.д. – Vijay

+0

первый файл, как этот 011111111111111111111+ 012554565645645455555+ .... ... ... второй файл 011111111111111111111111+ <измененные данные> 015456565653565644444444+ .... ... так ihae для сравнения оба файла из 1-25 символов (до + sybol) в качестве ключа и, если второй файл соответствует запись .. я должен заменить его в первом файле ... или просто добавить его в первый файл ......... – 2009-10-13 10:05:51

ответ

1

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

if [ "$d" != NULL ];

Try.

+0

, который помог удалить первую ошибку ... спасибо .... но есть один более simialr ошибка при сравнении обоих индикаторов .... в , если [$ var == $ var1]; нужна помощь ........ – 2009-10-09 12:29:19

+0

Если вы уверены, что «Расположения» в заявлении if? – vpram86

+0

Дело в сравнении строки в bash заключается в том, что вы должны ставить ее вокруг, если вы не уверены, что в ней никогда не будет места. Поскольку Bash будет подставлять значение этой переменной в качестве параметра для «if», а параметры разделяются пробелом (поэтому, если значение содержит пробел, вы получаете несколько переменных). Итак, сначала оберните его кавычками. Далее, используйте «==» и «! =» При сравнении строк. : D – NawaMan

0

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

diff file1 file2 > whats_the_diff.txt 
+0

Это не то, что мне нужно. Мне нужно сравнить только идентификаторы и обновление, как в базе данных. – 2009-10-09 12:56:23

1

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

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

if [[ $var == $var1 ]] 

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

if [[ $d != "" ]] 

или

if [[ $d ]] 

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

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

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

var=${line:3:23} 

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

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

Смежные вопросы