下面是一個awk腳本我從previous answer修改。
#!/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
注意,該記錄的字段是作爲單獨的行的輸出。輸入文件可以被賦予腳本,而不是回顯。
爲什麼'FFF'值未加引號?這不應該在awk引用的字符串中嗎?這也不是一個有效的awk程序。這裏涉及'csh'嗎? –
這裏的問題不是'bc'輸出多行,但你只讀一行? –
這是一個正在運行的awk腳本,我通過csh腳本調用。我只是用一個恆定的十六進制值替換了awk腳本中的列號來構建這個例子。該腳本適用於讓我們說64位十六進制輸入。 –