我想将 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:找不到命令
如果代码中的[
和$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" ]
使用 awk 替换所有
#!/bin/bash
A="$HOME/A.txt"
B="$HOME/B.txt"
awk 'NR==FNR{a[$1];next} $1 in a' $B $A