簡體   English   中英

在Bash中創建數組數組並按派生值排序

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM