如何在系统命令中使用awk脚本的shell变量



我在使用 awk 从 txt 文件中覆盖十六进制到十进制时遇到麻烦。

我想这样做

awk -F' '   '{   system("echo '$((16#"$1"))'") '} $file_name

但不工作...然后我尝试其他代码

awk -F' ' -v var=""echo x27$((16#" '{var=var$1"))x27"" system(var) }' $file_name

也不行。 但是然后打印变量在此处输入图像描述

我该怎么办?

使用 awk

要使用 GNU awk 将十六进制转换为十进制:

$ echo '0xFFFFFFFE' | awk -n '{printf "%in",$1}'
4294967294

或:

$ x='0xFFFFFFFE'
$ awk -n -v x="$x"  'BEGIN{printf "%in",x}'
4294967294

或:

$ x='0xFFFFFFFE'; awk -v x="$x"  'BEGIN{print strtonum(x)}'
4294967294

要使用 bash 将十六进制转换为十进制:

$ echo $((0xFFFFFFFE))
4294967294

局限性:

1. GNU awk is limited to 52-bit integers.
2. The above could be extended to perform two's-complement arithmetic but it hasn't.

要避免这两个限制,请参阅下面的 python 解决方案:

使用蟒蛇

Awk 不处理长整数。 对于长整数,请考虑以下 python 脚本:

$ cat n.py
#!/usr/bin/python3
import sys
def h(x):
        x = int(x, 16)
        return x if x < 2**63 else x - 2**64
for line in sys.stdin:
        print(*[h(x) for x in line.split()])

让我们使用此输入文件:

$ cat file
FFFFFFFFFFFFFFFF EFEFEFEFEFEFEFEF

当我们运行脚本时,我们发现:

$ python3 n.py <file
-1 -1157442765409226769

最新更新