我使用bc将长十六进制矢量转换为二进制。它对我的awk脚本中的以下代码示例不起作用:
conversion result: 11111111111111111111111111111111111111111111111111111111111111111111\
我得到以下输出:
{{1}}
这不是完整的结果。 bc不会转换整个字符串,并在其间截断“\”。如何转换整个十六进制数?
答案 0 :(得分:0)
以下命令使bc在一行中返回1000个字符的二进制字符串。
cmd = "BC_LINE_LENGTH=1000 bc <<< \"ibas ...\"
答案 1 :(得分:0)
这是我从previous answer修改的awk脚本。
#!/usr/bin/awk -f
{
cnt = split($0, a, FS)
if( convertArrayBase(16, 2, a, cnt) > -1 ) {
# use the array here
for(i=1; i<=cnt; i++) {
print a[i]
}
}
}
# Destructively updates input array, converting numbers from ibase to obase
#
# @ibase: ibase value for bc
# @obase: obase value for bc
# @a: a split() type associative array where keys are numeric
# @cnt: size of a ( number of fields )
#
# @return: -1 if there's a getline error, else cnt
#
function convertArrayBase(ibase, obase, a, cnt, i, b, c, cmd) {
cmd = sprintf("echo \"ibase=%d;obase=%d", ibase, obase)
for(i=1; i<=cnt; i++ ) {
cmd = cmd ";" a[i]
}
cmd = cmd "\" | bc"
i = 0 # reset i
while( (cmd | getline b) > 0 ) {
# if the return from bc is long, check for "\$" and build up c
if( b ~ /\\$/ ) {
sub(/\\/, "", b)
c = c b
continue;
}
a[++i] = c ? c b : b
c = ""
}
close( cmd )
return i==cnt ? cnt : -1
}
当脚本被调用awko
和chmod +x awko
时,它可以像:
$ echo "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" | ./awko
111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
脚本尝试转换记录中所有字段的基础,因此以下内容也有效:
$ echo "A B C D E F" | ./awko
1010
1011
1100
1101
1110
1111
请注意,记录的字段是作为单独的行输出的。可以将输入文件提供给脚本而不是echo。