Bash

AWK 將異構字節偏移量的大數據放入數組中

  • June 29, 2015

假設數據由不固定的字節偏移量組成,即兩個後續文件頭的距離不同。這個執行緒的重點是在數組中分別遍歷每個大小的事件。

範例數據

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 數組中?您還可以在讀取每個事件後將其儲存到文件中,而無需再次開始讀取文件並從左側繼續讀取。

問題

這裡有很多問題

#!/bin/bash

myarr = (

它之間有一個空格,這意味著即使它執行也沒有分配任何內容。

cat 25.6.2015_test.txt | awk

awk可以打開自己的文件不需要cat

-F 'fafafafa' '$1~/^[a-z0-9*]+$/

-F 是欄位分隔符而不是記錄,所以這一切都是刪除 text 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

引用自:https://unix.stackexchange.com/questions/212038