【问题标题】:Bash - convert array to lines (for using sort & uniq)Bash - 将数组转换为行(用于使用排序和 uniq)
【发布时间】:2014-10-05 23:12:51
【问题描述】:

假设我有一个这样的数组 (a a b b b c c d) 我希望数组每个字符/字符串只有一个(a b c d) 有什么方法可以将数组转换为行,这样我就可以在没有临时文件的情况下使用 sort & uniq?

谢谢!

【问题讨论】:

标签: bash


【解决方案1】:

您可以使用printf 命令。

printf "%s\n" "${array[@]}" | sort | uniq

这将打印array 的每个元素,后跟一个换行符到标准输出。

要重新填充数组,您可以使用

readarray -t array < <(printf "%s\n" "${array[@]}" | sort | uniq)

但是,您可以改为简单地使用关联数组来过滤掉重复项。

declare -A aa
for x in "${array[@]}"; do
    aa[$x]=1
done
array=()
for x in "${!aa[@]}"; do
    array+=("$x")
done

【讨论】:

  • 也可以将... | sort | uniq合并成... | sort -u
  • array=("${!aa[@]}")
  • 我到底为什么要写第二个for循环?
【解决方案2】:

出于好奇,以下:

arr=(a a b b b c c d)
echo "${arr[@]}" | xargs -n1 | sort -u

打印

a
b
c
d

echo "${arr[@]}" | xargs -n1 | sort -u | xargs

打印

a b c d

【讨论】:

    【解决方案3】:
     for x in a a b b b c c d; do echo -e $x; done | sort | uniq
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-01-14
      • 2022-06-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多