我有一个文件(tmp1),它是采用以下格式的数字列表:
4373610497
4416339969
4426498049
4435738625
这里的每个 64 位数字实际上是由多个 16 位字段组成,其中包含我感兴趣的数字。
例如(并且仅显示此处重要的 48 位):
4435738625 = 0000000000000001 0000100001100100 0000000000000001
我想要的数字是:
a= 0000000000000001 = 1
b= 0000100001100100 = 2148
c= 0000000000000001 = 1
这是我现在用来执行此操作的代码 - 但速度非常慢。输入文件包含 500K 到 100 万行,因此我正在尝试寻找更快或更有效地完成此操作的方法。
while read line; do
a=$((((line >> 32)) & 65535));
b=$((((line >> 16)) & 65535));
c=$((line & 65535));
printf "$a $b $c\n" >>tmp2
done <tmp1
我需要在 FreeBSD 机器上运行它 - 所以我不能使用 gawk。而且 awk 似乎不允许按位运算。
最佳答案
有一个解决方案可以满足您的需求。但如果它的工作速度比你的快,我就无法判断。你可以测试一下。
这里我只是用你的例子中的一个数字进行测试,你可以将它包装在一个循环中。
kent$ printf "%064s\n" "$(bc <<< "obase=2;4435738625")"|sed -r 's/.{16}/ibase=2;&\n/g'|bc
1
2148
1
关于bash - 使用 bash、awk 或 sed 对文件中的每个数字进行位移位和位屏蔽的最快方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19404367/