Кстати вы написали свой пример, это выглядит, как вы хотите, чтобы преобразовать запись AWK (строки) в ассоциативный массив. Вот AWK исполняемый скрипт, который позволяет, что, выполнив команду bc
над значениями в split
типа массива: с
#!/usr/bin/awk -f
{
# initialize the a array
cnt = split($0, a, FS)
if(convertArrayBase(10, 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, 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) {
a[++i] = b
}
close(cmd)
return i==cnt ? cnt : -1
}
При использовании с входом:
1 2 3
4 s 1234567
Этот сценарий выводит следующее:
1
10
11
100
0
100101101011010000111
Функция convertArrayBase
работает на split
типах массивов. Таким образом, вы должны инициализировать входной массив (a
здесь) с полной строкой (как показано) или подфайлами поля (не показаны) перед вызовом. Он разрушает массив.
Вы можете вместо этого позвонить bc
непосредственно с некоторыми вспомогательными файлами, чтобы получить аналогичный вывод. Я не обнаружил, что bc
поддерживается -
(stdin
как файл), так что это немного больше, чем хотелось бы.
Изготовление start_cmds
файла, как это:
ibase=10;obase=2;
и quit_cmd
как:
;quit
Учитывая входной файл (называемый data.semi
), где данные, разделенные ;
, как это:
1;2;3
4;s;1234567
Вы можете r ип bc
как:
$ bc -q start_cmds data.semi quit_cmd
1
10
11
100
0
100101101011010000111
, который те же данные, что сценарий AWK выводит, но только вызов bc
один раз со всеми входами. Теперь, в то время как эти данные не в массиве AWK ассоциативного в скрипте bc
выход может быть записан в виде стандартного ввода входных данных для AWK и reassembed в массив, как:
bc -q start_cmds data.semi quit_cmd | awk 'FNR==NR {a[FNR]=$1; next} END { for(k in a) print k, a[k] }' -
1 1
2 10
3 11
4 100
5 0
6 100101101011010000111
где конечная черта говорит AWK в обработайте stdin
в качестве входного файла и вы сможете добавлять другие файлы позже для обработки.
Вы пытаетесь использовать awk, как вы бы использовали bash. Это два разных языка, предназначенные для двух разных вещей, поэтому вы не можете брать синтаксис из одного и использовать его в другом. Пожалуйста, отредактируйте свой вопрос, чтобы показать нам, что именно вы пытаетесь сделать. Некоторый вход и желаемый выход всегда полезны. –
То, что вы поставили в сообщение до сих пор, не использует ничего, что делает 'awk'. Почему 'awk' участвует здесь вообще? –
Я хочу узнать из принятого ответа этого сообщения [ссылка] (http://stackoverflow.com/questions/18870209/convert-a-decimal-number-to-hexadecimal-and-binary-in-a-shell- сценарий). В моем случае я хочу сохранить значение в переменной. –