Поместите большие данные гетерогенного байтового смещения в массивы AWK

Предположим, что данные состоят из смещения байта, которое не фиксировано, т. Е. Расстояние двух последующих заголовков файлов меняется. Точка этого потока состоит в том, чтобы проходить каждый размер событий отдельно в массивах.

Примеры данных

fafafafa 00005e58 da1e5afe 00000000 * fafafafa 00005e58 da1e5afe 00000000 * 00000001 ffffffff 555eea72 00000000 * 00000004 fafafafa 01da1300 * 00000004 02991c00 fafafafa 01da1300 fafafafa 01da1300 fafafafa 01da1300 

где полевым fafafafa является fafafafa .

Мое предложение

 #!/bin/bash # http://stackoverflow.com/a/10383546/54964 # http://unix.stackexchange.com/a/209789/16920 myarr = ($( cat 25.6.2015_test.txt | awk -F 'fafafafa' '$1~/^[a-z0-9*]+$/ {print $1}') ) # http://stackoverflow.com/a/15105237/54964 # Now access elements of an array (change "1" to whatever you want) echo ${myarr[1]} # Or loop through every element in the array for i in "${myarr[@]}" do : echo $i done 

Скрипт в целом

Вывод

 awk2array.sh: line 5: syntax error near unexpected token `(' awk2array.sh: line 5: `myarr = ($( cat 25.6.2015_test.txt | awk -F 'fafafafa' '$1~/^[a-z0-9*]+$/ {print $1}') ) ' 

которые я не понимаю, так как даже скобки. Я хотел бы получить вывод в массив или сохранить каждое событие в файл с именем арифметически (0.txt, 1.text, …, n.txt). Теперь я описываю некоторые команды отдельно и некоторые части кодов, о которых я не уверен.

Команда AWK запускается отдельно

Команда AWK при запуске отдельно опускает полевой делитель, давая

 00005e58 da1e5afe 00000000 * 00005e58 da1e5afe 00000000 * 00000001 ffffffff 555eea72 00000000 * 00000004 01da1300 * 00000004 02991c00 01da1300 01da1300 01da1300 

Требуемый вывод состоит в том, чтобы иметь все данные в массиве, где разделитель полей является fafafafa , так что fafafafa должен быть включен в ячейку, например

 Value of first cell in array ---------------------------- fafafafa 00005e58 da1e5afe 00000000 * Value of second cell -------------------- fafafafa 00005e58 da1e5afe 00000000 * 00000001 ffffffff 555eea72 00000000 * 00000004 3rd cell -------- 01da1300 * 00000004 02991c00 4th cell -------- fafafafa 01da1300 5th cell -------- fafafafa 01da1300 6th cell -------- fafafafa 01da1300 

Как вы можете хранить большие данные в массиве N AWK? Вы также можете сохранить каждое событие в файл после его чтения, не заново прочитав файл и продолжая с точки, где осталось.

  • Какой шестнадцатеричный код для раздела / boot
  • Соответствие шестнадцатеричных значений в выражении case
  • В чем смысл символа Star * в Hex-данных?
  • Почему xxd не показывает знак порядка байтов?
  • Grep не соответствует символам без ascii
  • Сценарий Bash: hex
  • printf в сценарии оболочки can not do \ x% x
  • Как преобразовать специальный шестнадцатеричный символ из html-страницы в bash?
  • 3 Solutions collect form web for “Поместите большие данные гетерогенного байтового смещения в массивы AWK”

    проблема

    Так много чего не так

     #!/bin/bash myarr = ( 

    имеет пространство между ним, что означает, что ничего не назначается, если он даже работает вообще.

     cat 25.6.2015_test.txt | awk 

    Awk может открыть свои собственные файлы, нет необходимости в кошке

     -F 'fafafafa' '$1~/^[a-z0-9*]+$/ 

    -F – это разделитель полей, а не запись, поэтому все это делается, удаляя текст fafafafa , он все еще читает каждую строку в качестве записи, поэтому ваше следующее условие совершенно бессмысленно.

     myarr = ($( cat 25.6.2015_test.txt | awk -F 'fafafafa' '$1~/^[a-z0-9*]+$/ {print $1}') ) 

    Это приведет к печати нескольких строк, которые будут отдельными элементами в массиве, поскольку они разделены на строки новой строки и не имеют видимости того, что является записью в awk (если вы действительно разделили на записи вместо полей).

     echo ${myarr[1]} echo $i 

    Процитировать их, если вы не хотите видеть все файлы в вашем каталоге каждый раз, когда вы эхо (из-за * в записях)

      : 

    Зачем ?


    Решение

     # Create an array myarr=() # Save the number of different blocks to be saved, notice the # `-vRS` which sets the field separator blocks=$(awk -vRS='fafafafa' '$1~/^[a-z0-9*]+$/{x++}END{print x}' file) # While the the counter is less than the number of blocks. while [[ $x -le $blocks ]] ;do # Increase the counter ((x++)) # Add the value for that block to the array, notice the quotes around # `$()`, they are important in keeping all the block as one array # element. The awk also increments its own counter for each # occurrence of 'fafafafa' and your condition for '$1'. When both # counters match the block is saved to the array. myarr+=("$(awk -vRS='fafafafa' -vN="$x" '$1~/^[a-z0-9*]+$/{x++} x==N{print RS$0}' test)") done 
     while read -d '&' -r data do myarr[${#myarr[@]}]="$data" done < <(sed '1! s/fafafafa/\&&/' 25.6.2015_test.txt) 

    поместит все ваши данные из файла 25.6.2015_test.txt в массив myarr разделенный fafafafa вместе с ним. sed используется для размещения символа деминера & (вы можете использовать любые, которые не ожидаются в тексте) перед fafafafa кроме первой строки (в противном случае мы получаем пустой 1-й элемент массива). read помещает часть текста, разделенную & на промежуточные data переменной. ${#myarr[@]} производит количество элементов в массиве myarr . Поскольку нумерация начинается с 0 мы можем получить индекс следующего элемента массива:

    • array empty, число элементов равно 0, поэтому первый элемент имеет индекс == 0
    • массив имеет 1 элемент с индексом 0, поэтому число элементов равно 1, следующий индекс == 1
    • массив имеет 2 элемента с индексами 0,1, поэтому число элементов равно 2, следующий индекс == 2

    Линия

     myarr = ($( cat 25.6.2015_test.txt | awk -F 'fafafafa' '$1~/^[a-z0-9*]+$/ {print $1}') 

    неправильно. Используйте следующую строку:

     myarr=$(awk -F 'fafafafa' '$1~/^[a-z0-9*]+$/ {print $1}' 25.6.2015_test.txt) 

    И вы должны использовать " :

     echo "${myarr[1]}" 

    а также

     echo "$i" 

    И вы можете использовать эту команду awk

    • с fafafafa :

       awk '{if ($1 ~ /^fafafafa$/) {line+=1; print ""; print "cell "line;print "--------"; print $1} else {print $1}}' 25.6.2015_test.txt 
    • без fafafafa

       awk '{if ($1 ~ /^fafafafa$/) {line+=1; print ""; print "cell "line;print "--------";} else {print $1}}' 25.6.2015_test.txt 

    Пример вывода без fafafafa

     cell 1 -------- 00005e58 da1e5afe 00000000 * cell 2 -------- 00005e58 da1e5afe 00000000 * 00000001 ffffffff 555eea72 00000000 * 00000004 cell 3 -------- 01da1300 * 00000004 02991c00 cell 4 -------- 01da1300 cell 5 -------- 01da1300 cell 6 -------- 01da1300 
    Interesting Posts

    Perl однострочный для замены кодового блока

    Как изменить стандартный «полноэкранный» монитор?

    У sed есть функция, превосходящая awk?

    Совместное использование файлов с Windows

    Определите, какие java-приложения запускаются в имени java-процесса

    В чем цель libimf.so?

    Автоматически снимать скриншот определенного дисплея в X

    Как получить список кодов выхода (и / или коды возврата) и значение для команды / утилиты?

    Заблокировать экран при приостановке с помощью Awesome WM

    Как остановить экземпляр CACHE из Shell Script

    Ошибка монтирования: сбой подключения: файл существует

    Cron только время от времени отправляет электронную почту на выходе и ошибки

    мы повторно запустим `createrepo` после копирования новых файлов в репозитории

    Набор инструментов для получения изображений Matlab не распознает мою веб-камеру

    Как я могу запускать скрипты на виртуальной машине, когда я вставляю CD или DVD в хост?

    Linux и Unix - лучшая ОС в мире.