我有一個文本檔案,有時(并非總是)會有一個像這樣具有唯一名稱的陣列
unique_array=(1,2,3,4,5,6)
我想在上面的示例中找到陣列 6 的大小 - 當它存在時跳過它,如果不存在則回傳 -1。
grepping 檔案會告訴我陣列是否存在,但不會告訴我如何找到它的大小。
該陣列可以填充多行,例如
unique_array=(1,2,3,
4,5,6,
7,8,9,10)
陣列中的某些元素可以為負數,如
unique_array=(1,2,-3,
4,5,6,
7,8,-9,10)
uj5u.com熱心網友回復:
awk -v RS=\) -F, '/unique_array=\(/ {print /[0-9]/?NF:0}' file.txt
-v RS=\))- 用換行符而不是換行符分隔記錄-F,,- 用空格而不是空格分隔欄位/unique_array=(/- 查找包含唯一識別符號的記錄/[0-9]?NF:0- 如果記錄包含數字,欄位數(即逗號 1),否則為0
uj5u.com熱心網友回復:
您的規格非常不完整,但猜測一下您實際上在尋找什么,至少可以作為一個起點嘗試一下。
awk '/^unique_array=\(/ { in_array = 1; n = split(",", arr, $0); next }
in_array && /\)/ { sub(/\)./, ""); quit = 1 }
in_array { n = split(",", arr, $0);
if (quit) { print n; in_array = quit = n = 0 } }' file
我們保留一個狀態變數in_array,它告訴我們當前是否在包含陣列的區域中。當我們看到陣列的開頭時,它被設定為 1,當我們看到右括號時,它被設定為 0。此時,我們洗掉右括號及其后面的所有內容,并設定第二個變數quit以觸發下一個條件中的整理邏輯。最后一個條件執行兩個任務;它將這一行中的專案添加到計數中n,然后檢查是否quit為真;如果是,我們在陣列的末尾,并列印元素的數量。
如果找不到陣列,這將不列印任何內容。如果您愿意,可以修飾腳本以設定不同的退出代碼或列印 -1,但這些細節對于簡單腳本來說似乎是不必要的復雜化。
uj5u.com熱心網友回復:
使用 GNU grep 或類似的支持-z和-o選項:
grep -zo 'unique_array=([^)]*)' file.txt | tr -dc =, | wc -c
-z- (有效地)將檔案視為單行-o- 只輸出匹配tr -dc =,- 剝離一切,除了=和,wc -c- 計算結果
注意:一元素和零元素陣列都將被視為大小為 1。如果未找到,將回傳 0 而不是 -1。
uj5u.com熱心網友回復:
使用 sed 和declare -a. 測驗檔案是這樣的:
$ cat f
saa
dfsaf
sdgdsag unique_array=(1,2,3,
4,5,6,
7,8,9,10) sdfgadfg
sdgs
sdgs
sfsaf(sdg)
測驗:
$ declare -a "$(sed -n '/unique_array=(/,/)/s/,/ /gp' f | \
sed 's/.*\(unique_array\)/\1/;s/).*/)/')"
$ echo ${unique_array[@]}
1 2 3 4 5 6 7 8 9 10
然后你可以做任何你想做的事${unique_array[@]}
uj5u.com熱心網友回復:
這是假設總是被稱為“unique_array”
注意:將 array.txt 替換為檔案名
if [ $(grep -c "unique_array" array.txt) -eq 0 ]; then
echo -1
else
unique_array=($(cat array.txt | tr ',' ' '))
echo ${#unique_array[@]}
fi
uj5u.com熱心網友回復:
我認為您可能想要的是這個,使用 GNU awk 進行多字符 RS 和 RT 以及字邊界:
$ awk -v RS='\\<unique_array=[(][^)]*)' 'RT{exit} END{print (RT ? gsub(/,/,"",RT) 1 : -1)}' file
uj5u.com熱心網友回復:
這是一個awk適用于gawk、mawk 1/2和的解決方案nawk:
測驗輸入
saa
dfsaf
sdgdsag unique_array=(1,2,3,
4,5,6,
7,8,9,10) sdfgadfg
sdgs
sdgs
sfsaf(sdg)
代碼
{m,n,g}awk '
BEGIN { __ = "-1:_ERR_NOT_FOUND_"
RS = "^$" (_ = OFS = "")
FS = "(^|[ \t-\r]?)unique[_]array[=][(]"
___ = "[)].*$|[^0-9,. -]"
} $!NF = NR < NF ? $(gsub(___,_)*_) : __'
輸出
1,2,3,4,5,6,7,8,9,10
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/487305.html
上一篇:使用SED修復新行
