簡體   English   中英

Bash Array 排序不正確

[英]Bash Array not sorting correctly

我需要對這兩個數組進行排序,我不關心輸出的格式,我只需要對其進行排序以比較它們,但這似乎不起作用,盡管它適用於更簡單的文本。 我也嘗試刪除 --field-separator='"'

DIG_1=("sampletext""zzz""ms=ms91608007""asdas")
DIG_2=("zzz""ms=ms91608007""sampletext""asdas")
echo "unsorted:"
echo ${DIG_1[*]}
echo ${DIG_2[*]}
IFS=$'\n' sorted=($(sort --field-separator='"' <<<"${DIG_1[*]}")); unset IFS
IFS=$'\n' sorted2=($(sort --field-separator='"' <<<"${DIG_2[*]}")); unset IFS
echo "sorted:"
echo ${sorted[*]}
echo ${sorted2[*]}

我得到的輸出是:

unsorted:
sampletextzzzms=ms91608007asdas
zzzms=ms91608007sampletextasdas
sorted:
sampletextzzzms=ms91608007asdas
zzzms=ms91608007sampletextasdas

我怎樣才能解決這個問題? 我希望它是,例如:

unsorted:
sampletextzzzms=ms91608007asdas
zzzms=ms91608007sampletextasdas
sorted:
asdasms=ms91608007sampletextzzz
asdasms=ms91608007sampletextzzz
  1. 沒有理由使用數組來存儲一個元素。

  2. 由於需要保留雙引號,因此需要努力保留它們:

     DIG_1='"sampletext""zzz""ms=ms91608007""asdas"'

    否則雙引號將被 shell 刪除3.5.9 Quote Removal

  3. 當您使用VAR=value some_command ,該變量僅在 some_command 的持續時間內設置——bash 將該變量放入命令的環境中,而不是放入 shell 自己的變量目錄中。 隨后不需要取消設置變量——取消設置 IFS 變量可能對程序的其余部分有害

  4. sort不會對記錄中的字段進行排序,它用於對記錄進行相互排序。 為了完成你想要的,這將:

     sorted_1=$(grep -Po '(?<=").*?(?=")' <<<"$DIG_1" | sort | paste -s -d "")

正如 anubhava 在評論中提到的,當前的代碼正在創建單個值的數組,即:

$ DIG_1=("sampletext""zzz""ms=ms91608007""asdas")
$ typeset -p DIG_1
declare -a DIG_1=([0]="sampletextzzzms=ms91608007asdas")

$ DIG_2=("zzz""ms=ms91608007""sampletext""asdas")
$ typeset -p DIG_2
declare -a DIG_2=([0]="zzzms=ms91608007sampletextasdas")

假設 OP 確實需要一個數組,並且數組元素將在以后的代碼中使用,我們需要一種方法來分隔數組的項,最簡單的方法是使用一些空格,例如:

$ DIG_1=("sample text" "zzz" "ms=ms91608007" "asdas")
$ typeset -p DIG_1
declare -a DIG_1=([0]="sample text" [1]="zzz" [2]="ms=ms91608007" [3]="asdas")

$ DIG_2=("zzz" "ms=ms91608007" "sample text" "asdas")
$ typeset -p DIG_2
declare -a DIG_2=([0]="zzz" [1]="ms=ms91608007" [2]="sample text" [3]="asdas")

:我添加了改變單一的空間"sampletext""sample text" ,使我們可以看到一個空間是如何處理的)作為數據對B的一部分)作為分隔符。

注意:假設 OP 代碼正在生成有問題的數組分配(例如, DIG_1=("sampletext""zzz""ms=ms91608007""asdas") ),那么尋找“修復”數組生成器的方法可能更有意義而不是通過試圖弄清楚如何將這些單個字符串視為由 4 部分組成的數組定義來使代碼復雜化。

此外,由於示例輸出(當前與所需)沒有顯示雙引號,我猜這意味着雙引號不是實際數據的一部分,而只是分隔符。

現在我們有了一個實際的元素數組,我們可以查看對數組進行排序並將結果存儲到其他(已排序)數組中,例如:

$ IFS=$'\n' sorted=($(printf "%s\n" "${DIG_1[@]}" | sort))
$ typeset -p sorted
declare -a sorted=([0]="asdas" [1]="ms=ms91608007" [2]="sample text" [3]="zzz")

$ IFS=$'\n' sorted2=($(printf "%s\n" "${DIG_2[@]}" | sort))
$ typeset -p sorted2
declare -a sorted2=([0]="asdas" [1]="ms=ms91608007" [2]="sample text" [3]="zzz")

在這一點上,我們現在有 2 組數組...... 1)原始數據( DIG_1[@]DIG_2[@] )和 2)已排序( sorted[@]sorted2[@] )。

然后 OP 可以根據需要對數據進行切片,並以任何所需的格式打印數組的內容,例如:

# print array elements on a single line with no delimiters, storing the results
# in variables for later use/comparison/display

$ printf -v srt "%s" "${sorted[@]}"
$ typeset -p srt
declare -- srt="asdasms=ms91608007sample textzzz"
$ echo "${srt}"
asdasms=ms91608007sample textzzz

$ printf -v srt2 "%s" "${sorted2[@]}"
$ typeset -p srt2
declare -- srt2="asdasms=ms91608007sample textzzz"
$ echo "${srt2}"
asdasms=ms91608007sample textzzz

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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