bash - 使用 bash、awk 或 sed 对文件中的每个数字进行位移位和位屏蔽的最快方法是什么?

标签 bash sed awk bit-manipulation freebsd

我有一个文件(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/

相关文章:

php - 通过 Crontab(Cron 作业)将 AWS 数据库备份 RDS 到 S3

regex - 如何使用正则表达式识别重复字符?

mysql - 将带有子线的行转换为单行

sed - 使用sed从文件中删除^ M个字符

macos - awk:根据用户输入对文件进行排序

linux - 在 info bash 中找不到 'date' 命令的描述 - 找到可从 shell 调用的所有命令的列表

linux - 用于监控资源使用情况和电子邮件警告的 Bash 脚本

bash - 使用 awk 或 sed 基于无关列创建新行

linux - 如何使用变量格式存储 printf 的输出?

bash - 带有 sed 的 grep 管道