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

おすすめ記事