2014-02-10 3 views
0

Я хочу сравнить первый элемент каждой строки в A.txt с первым элементом строк B.txt и если они совпадают с печатью этой строки A. Оба элемента первой строки A и B - это шестнадцатеричные числа, и я написал следующий код на основе https://askubuntu.com/questions/366879/awk-comparing-the-value-of-two-variables-in-two-different-files.Сравнение шестнадцатеричных чисел в оболочке

#!/bin/bash 
A="$HOME/A.txt" 
B="$HOME/B.txt" 

cat $A | while read a; do 
a1=$(echo $a | awk ' { print $1 }') 
    cat $B | while read b; do 
     b1=$(echo $b | awk ' { print $1 }') 
     if [ $a1 == $b1 ]; then 
      echo $a 
     fi 
    done 
done 

Вот что я получаю: линия 9: [0x6200e001: команда не найдена

+1

Это произойдет, если у вас не было пробела между '' и '$ a1'. Вы пытались запустить код после того, как вы его очистили, чтобы опубликовать его? –

+1

Вы уверены, что есть место сразу после квадратной скобки? –

+0

Оба вы правы. решена! – user2517676

ответ

2

Эта проблема возникает, если у вас нет пространства между [ и $a1 в вашем коде. Всегда проверяйте точный код, который вы публикуете, - не предполагайте, что ваша чистая версия будет иметь ту же проблему, что и ваш фактический код.

Вот как воспроизвести его:

$ cat file 
a1=0x6200e001 
b1=$a1 
[$a1 == $b1 ] 

$ bash file 
file.sh: line 3: [0x6200e001: command not found 

$ shellcheck file 

In file line 3: 
[$a1 == $b1 ] 
^-- SC1035: You need spaces after the opening [ and before the closing ]. 

Исправления добавить пространство:

[ $a1 == $b1 ] 

Вы должны оптимален также процитировать переменные, чтобы предотвратить проблемы с пробелами и Глобы символами:

[ "$a1" = "$b1" ] 
+1

http://shellcheck.net - удобный веб-сайт для рисования скриптов sh/bash; версия CLI, как показано в этом ответе, может быть построена из источника - см. https://github.com/koalaman/shellcheck. В bash обычно предпочтительнее использовать более надежные и многофункциональные '[[...]]', а не '[...]'; использование '[[...]]' также устраняет необходимость ссылок на двойные кавычки. – mklement0

2

Использование awk для замены всех

#!/bin/bash 

A="$HOME/A.txt" 
B="$HOME/B.txt" 

awk 'NR==FNR{a[$1];next} $1 in a' $B $A 
+0

+1 для упрощения оригинального кода. – mklement0

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