通过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

想要的输出是将所有数据放在数组中,其中字段分隔符fafafafafafafafa包含在单元格中,例如

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数组中,myarrfafafafa与其一起分隔开。 sed用于在第一行之外放置定界符&(您可以使用文本中不需要的任何字符)fafafafa(在相反的情况下,我们收到数组的空第一个成员)。read将由 分隔的文本部分放入&中间变量 中data${#myarr[@]}产生 array 中的元素数量myarr。由于计数从这里开始,0因此我们可以接收数组下一个元素的索引:

  • 数组为空,元素数量为 0,因此第一个元素的索引 == 0
  • 数组有 1 个索引为 0 的元素,因此元素数为 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

相关内容