데이터는 고정되지 않은 바이트 오프셋으로 구성되어 있다고 가정합니다. 즉, 두 개의 후속 파일 헤더 사이의 거리가 다릅니다. 이 스레드의 요점은 배열에서 각 크기의 이벤트를 개별적으로 반복하는 것입니다.
샘플 데이터
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
. 첫 번째 줄 외부에 구분 기호 (텍스트에 필요하지 않은 문자를 사용할 수 있음)를 배치하는 데 사용됩니다 (그 반대의 경우 배열의 첫 번째 빈 멤버를 받습니다). 구분된 텍스트 부분을 중간 변수 에 넣습니다 . 배열의 요소 수를 반환합니다 . 여기에서 계산이 시작되므로 배열의 다음 요소에 대한 인덱스를 받을 수 있습니다.fafafafa
sed
&
fafafafa
read
&
data
${#myarr[@]}
myarr
0
- 배열이 비어 있고 요소 수가 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