в программе Unix, как сравнить две строки в одном файле? - PullRequest
0 голосов
/ 02 февраля 2011

Привет, я должен написать одну программу в Unix, эта программа должна сравнивать две строки в одном файле, файл содержит ниже эти две строки вместе с другими данными, которые не используются в этой программе, я должен проверить в файле, если нет (например, 16) совпадает в обеих строках или нет.

Validating 16 transactions.
Rows valid: 16.

дает ошибку

1.prog: line 5: Validating: command not found
1.prog: line 6: Rows valid: command not found
1.prog: line 7: GRP1: command not found


NOT DONE
1.prog: line 11: =: command not found

Вот код:

#!/bin/sh
POINT='.'
for FILE in $HOME/l26026363.txt
do
  GRP1=grep "Validating" $FILE |cut -d' ' -f2
  GRP2=grep "Rows valid" $FILE |cut -d' ' -f3
  GRP1 =$GRP1$POINT
  echo $GRP1
  echo $GRP2 
  echo NOT DONE 
  if $GRP1 = $GRP2
   then  echo "IN IF"
   #mv FILE /home/appltest/test_dir
   fi
done

Ответы [ 3 ]

3 голосов
/ 02 февраля 2011

Ваш оператор if должен выглядеть следующим образом:

if [[ $GRP1 -eq $GRP2 ]]

(есть несколько вариантов в зависимости от того, какую оболочку вы на самом деле используете, но я думаю, что, вероятно, наиболее переносимая - используйтесправочные страницы для вашей данной оболочки, чтобы узнать правильный формат, если это не работает).

if принимает команду и проверяет возвращаемое значение из нее.Если первый аргумент, который вы даете, не является командой (например, переменная окружения, которая переводится в не-команду), он попытается запустить ее как команду и потерпит неудачу.


Вотрасшифровка bash сценария:

pax$ cat qq.bash
#!/bin/bash

GRP1=$(expr 22 + 3)
GRP2=$(expr 100 / 4)
GRP3=$(expr 75 - 5)

if [[ $GRP1 -eq $GRP2 ]] ; then
    echo "GRP1 and GRP2 are equal ($GRP1)"
else
    echo "GRP1 and GRP2 are unequal ($GRP1, $GRP2)"
fi

if [[ $GRP1 -eq $GRP3 ]] ; then
    echo "GRP1 and GRP3 are equal ($GRP1)"
else
    echo "GRP1 and GRP3 are unequal ($GRP1, $GRP3)"
fi

pax$ ./qq.bash
GRP1 and GRP2 are equal (25)
GRP1 and GRP3 are unequal (25, 70)
0 голосов
/ 03 февраля 2011

вам не нужно использовать grep несколько раз. Это пустая трата процессов. Используйте awk

for....
do    
    awk -vfile=$FILE '/Validating/{s1=$2}/Rows valid/{s2=$NF+0}
    END{
        if ( s1==s2 ){
          cmd="mv "file" /home/appltest/test_dir"
          system(cmd)
        }
    }' $FILE
done
0 голосов
/ 02 февраля 2011

В дополнение к выражению if, объясненному в другом ответе, при назначении переменной в оболочке путем вызова другой команды вы должны поставить ее в кавычки:

GRP1=`grep "Validating" $FILE |cut -d' ' -f2`
GRP2=`grep "Rows valid" $FILE |cut -d' ' -f3`
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...