AWK를 통해 이종 바이트 오프셋 빅데이터를 배열에 넣습니다.

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.

나의 충고

#!/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

AWK를 통해 빅데이터를 N 어레이에 저장하는 방법은 무엇입니까? 파일을 다시 읽기 시작하지 않고 왼쪽 지점부터 계속하지 않고도 각 이벤트를 읽은 후 파일에 저장할 수도 있습니다.

답변1

질문

여기에는 많은 문제가 있습니다

#!/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

답변2

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. 첫 번째 줄 외부에 구분 기호 (텍스트에 필요하지 않은 문자를 사용할 수 있음)를 배치하는 데 사용됩니다 (그 반대의 경우 배열의 첫 번째 빈 멤버를 받습니다). 구분된 텍스트 부분을 중간 변수 에 넣습니다 . 배열의 요소 수를 반환합니다 . 여기에서 계산이 시작되므로 배열의 다음 요소에 대한 인덱스를 받을 수 있습니다.fafafafased&fafafafaread&data${#myarr[@]}myarr0

  • 배열이 비어 있고 요소 수가 0이므로 첫 번째 요소의 인덱스 == 0
  • 배열에는 인덱스가 0인 요소가 1개 있으므로 요소 수는 1이고 다음 인덱스 == 1입니다.
  • 배열에는 2개의 요소가 있고 인덱스는 0,1이므로 요소 수는 2이고 다음 인덱스 == 2입니다.

답변3

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

관련 정보