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

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 
  • printf в сценарии оболочки can not do \ x% x
  • Соответствие шестнадцатеричных значений в выражении case
  • Как я могу выполнить двоичный поиск текстового файла для определенной строки символов?
  • Hexdump строки, начинающейся с новых строк?
  • Как преобразовать специальный шестнадцатеричный символ из html-страницы в bash?
  • Сценарий Bash: hex
  • Interesting Posts
    Linux и Unix - лучшая ОС в мире.