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

[1176108] Oracle Linux происходит от RHEL/CentOS, поэтому я ожидаю, что приложение будет доступно в одноименном пакете. Поиск на системе CentOS 6.x, который у меня здесь есть, приводит к следующему пакету:

Proto Recv-Q Send-Q Local Address           Foreign Address         State      
tcp        0      0 127.0.0.1:53            0.0.0.0:*               LISTEN     

Вы можете достигнуть пика внутри пакетов, используя [1176550]repoquery[1176551], если вы знаете имя так:

Для установки:

1
29.06.2015, 21:30
3 ответа

Проблема

Здесь так много неправильных вещей

#!/bin/bash

myarr = (

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

cat 25.6.2015_test.txt | awk

Awk может открывать свои собственные файлы без cat

-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
3
27.01.2020, 23:13

Строка

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 команду

  • с fafafa:

    awk '{if ($1 ~ /^fafafa$/) {line+=1; распечатать ""; распечатать "ячейку "line;распечатать "--------"; распечатать $1} else { распечатать $1}}' 25. 6.2015_test.txt
    
  • без fafafafa

    awk '{if ($1 ~ /^fafafafa$/) {line+=1; распечатать ""; распечатать "ячейку "line;распечатать "--------";} else { распечатать $1}}" 25.6.2015_test.txt
    

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

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
1
27.01.2020, 23:13
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 помещает часть текста, разделенную & , в данные промежуточной переменной . $ {# myarr [@]} создает количество элементов в массиве myarr . Поскольку нумерация начинается с 0 , мы можем получить индекс следующего элемента массива:

  • массив пуст, количество элементов равно 0, поэтому первый элемент имеет индекс == 0
  • массив имеет 1 элемент с индексом 0, поэтому количество элементов равно 1, следующий индекс == 1
  • массив имеет 2 элемента с индексами 0,1, поэтому количество элементов равно 2, следующий индекс == 2
3
27.01.2020, 23:13

Теги

Похожие вопросы