[英]Creating Arrays of Arrays in Bash and Sorting By Derived Values
我在Bash中創建和排序數組時遇到了問題,該數組將其內容作為命令中的行,將每一行的某些部分添加到數組的每一行之前對其進行操作。
為了明確起見,命令“ bogoutil -d wordlist.db”以以下形式給出輸出:
hello 428 3654 20151116
除了幾百萬行。
我想將輸出命令的每一行加載到一個數組中,取第一個數字的絕對值減去第二個數字的絕對值,然后將該值附加到新數組中的行上,然后按該新值對新數組進行排序。
我遇到的問題是,我懷疑IFS需要更改為“ \\ n”才能將bogoutil輸出的每一行放入數組中,但是隨后需要再次更改以標記每行中的第二和第三整數。 到目前為止,我很難弄清我的錯誤,因為數組中有超過1000萬行,但是我可以從輸出中看出我不是我應該得到的-我認為它只是列出每行並且沒有正確標記。 通常,它會運行一段時間,將大量輸出輸出到外殼中,這絕對不是我期望的(我認為它只是少數令牌,但絕對不是全部),然后打印
sort: cannot read: resultsarray: No such file or directory
這是我到目前為止所寫的
#!/bin/bash
IFS=$"\n" #set the IFS so it tokenises each line in the command
for i in $( bogoutil -d wordlist.db )
do
echo $i
OUTPUT=( ${i// \n} ) #swap out space for a newline so i can
#tokenise by spaces
BAD=${OUTPUT[1]}
echo $BAD
GOOD=${OUTPUT[2]}
echo $GOOD
DIFF=$GOOD-$BAD
echo $DIFF
if [ "$DIFF" -lt "0" ]
then
DIFF=$DIFF \* -1
fi
NEWOUT="$OUTPUT $DIFF" #append the abs of the difference to
#the line so i can sort by it
resultsarray[i]=$NEWOUT
done
sort -t " " -k 5 -g resultsarray
echo "${resultsarray[@]:0:10}"
任何幫助將不勝感激。 我真的很困惑,不知道為什么它不起作用。 我懷疑這與我嘗試標記輸出的每一行的方式有關,但我不確定。 另一個可能性(假設它列出令牌一段時間,然后停下來)是數組中的元素太多,它用完了分配的空間。 那有可能嗎?
在此先感謝您提供的任何幫助。
編輯:澄清預期的輸入和輸出。
樣本輸入為
hello 4 1 20151116
goodbye 0 256 20151116
grant 428 3654 20151116
預期的輸出將是
grant 428 3654 20151116 3226
goodbye 0 256 20151116 256
hello 4 1 20151116 3
如您所見,它按第一個數字與第二個數字之差的絕對值排序。 數據集中沒有負數,最低為0。
編輯:下面的awk解決方案效果很好! 我不確定如何使用Bash,但是我懷疑bash並不是正確的解決方法,無論如何,使用awk可能更好。 感謝您提供的所有幫助,非常感謝!
如果我正確理解了您的問題(這就是為什么將樣本輸入中的樣本輸出包含在內如此重要的原因),
cat tst.file
hello 428 3654 20151116
goodby -428 3655 20151116
假設輸入不是制表符分隔的數據。 另外,如果您希望使用稍大一些的數據集來更新問題,我們將很樂意嘗試確認這是一個很好的解決方案。 您可能還想從輸入中包括所需的輸出;-)(提示,提示)。
awk '
function abs( num) {return (num >0) ? -num : num;}
{res=abs($2)+$3 ; print $0 "\t" res}' tst.file \
| sort -t"${tabChar}" -k2n
產生像
hello 428 3654 20151116 3226
goodby -428 3655 20151116 3227
一些sort
程序支持-t"\\t"
來定義排序定界符的tabChar。 我的不是這樣的,我像tabChar=" "
一樣單獨定義它,這是dbl引號內的真實選項卡Char。
正如我在評論中提到的那樣,您可以像上面這樣簡化(假設程序中的std行結尾):
bogoutil -d wordlist.db \
| awk '....' \
| sort -k2n
IHTH
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.