Bash
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
想要的輸出是將所有數據放在數組中,其中欄位分隔符
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