首页 文章

比较Shell中的十六进制数

提问于
浏览
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:命令未找到

2 回答

  • 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 ]
    

    您应该最佳地引用变量以防止出现空格和glob字符的问题:

    [ "$a1" = "$b1" ]
    
  • 2

    使用awk替换所有

    #!/bin/bash
    
    A="$HOME/A.txt"
    B="$HOME/B.txt"
    
    awk 'NR==FNR{a[$1];next} $1 in a' $B $A
    

相关问题