Поместите большие данные гетерогенного байтового смещения в массивы 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? Вы также можете сохранить каждое событие в файл после его чтения, не заново прочитав файл и продолжая с точки, где осталось.

  • Grep не соответствует символам без ascii
  • Почему xxd не показывает знак порядка байтов?
  • Расширение Bash шестнадцатеричное
  • hexedit: изменить количество столбцов (байт на строку)
  • Соответствие шестнадцатеричных значений в выражении case
  • Hexdump строки, начинающейся с новых строк?
  • Hex-просмотрщик для Solaris (SunOS 5.11)
  • Проверьте, был ли диск с нулевым значением с xxd и uniq?
  • 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

    Неизвестная ошибка btrfs, раздел не будет монтироваться

    Как запустить скрипт при разблокировке?

    Проблема блокировки брандмауэра портов NFS

    Где MySQL установлен на моем компьютере?

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

    Photoshop в Wine не открывается, появляется ошибка «Файл не найден»

    Настройка рабочей среды – Konsole или другой терминал – открытие нескольких вкладок и запуск некоторых команд

    Как вы создаете символ звезды с ключевым словом в Linux?

    Как запустить скрипт с systemd перед выключением?

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

    Команда для удаления части данных JSON из каждой строки?

    не может изменить пользователя

    Понимание и настройка кеш-памяти

    как вставить пробел между отдельными цифрами в файле?

    Дефрагментация дискового ввода-вывода с одновременной записью в тот же файл

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