AWKを介して異種バイトオフセットビッグデータを配列に配置します。

AWKを介して異種バイトオフセットビッグデータを配列に配置します。

データは、固定されていないバイトオフセットで構成されていると仮定します。つまり、2つの後続のファイルヘッダー間の距離が異なります。このスレッドのポイントは、配列内の各サイズのイベントを個別に繰り返すことです。

サンプルデータ

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

関連情報