我想知道是否有一种方法可以用来检查$2是否将第7位设置为1来替换if语句?
cat $file | awk '{if ($2 == 87) print $1; else {}}' > out.txt"例如,93应该打印一些东西,而128不应该。
发布于 2015-07-02 16:40:16
bash具有按位运算符
测试第7位:
$ echo $(((93 & 0x40) != 0))
1
$ echo $(((128 & 0x40) != 0))
0但是,如果要解析文件中的值,最好继续使用awk,作为@RakholiyaJenish的答案
发布于 2015-07-02 16:38:01
您可以使用逐位运算来检查gawk中的第7位是否为1
and($2,0x40)注意:标准awk不支持按位操作。因此,您可以使用bash位操作或perl位操作(用于字符串处理)。
使用gawk
gawk '(and($2,0x40)){print $1}' filename使用perl
perl -ane 'print "$F[0]\n" if ($F[1]&0x40)' filename发布于 2017-01-24 14:12:25
您可以使用bash包装函数检查位集,在脚本或.bashrc中定义一个本地IFS运算符
# Returns the bit positions set in the number for the given bit mask
# Use the return value of the function directly in a script
bitWiseAnd() {
local IFS='&'
printf "%s\n" "$(( $* ))"
}并在如下所示的脚本函数中使用它
# The arguments to this function should be used as number and bit-mask, i.e.
# bitWiseAnd <number> <bit-mask>
if [ $(bitWiseAnd "93" "0x40") -ne 0 ]
then
# other script actions go here
echo "Bit set"
fi其思想是使用Input-Field-Separator(IFS),这是bash中的一个特殊变量,用于在展开后拆分单词,并将行拆分为单词。该函数在本地更改该值,以使用分词字符作为逐位AND运算符&。
请记住,IFS是在本地更改的,不会对函数作用域之外的默认IFS行为产生影响。摘录自man bash页面,
外壳程序将IFS的每个字符视为分隔符,并将其他扩展的结果拆分成这些字符上的单词。如果IFS是未设置的,或者它的值恰好是默认值,那么、和在前面的扩展结果的开头和结尾的序列将被忽略,任何不在开头或结尾的IFS字符序列用于分隔单词。
"$(( $* ))"表示要由&拆分的参数列表,然后使用printf函数输出计算值。该函数还可以扩展为添加其他算术运算的作用域。
https://stackoverflow.com/questions/31179484
复制相似问题