【问题标题】:Sorting a comma separated list of values对逗号分隔的值列表进行排序
【发布时间】:2010-08-10 00:19:46
【问题描述】:

在 Mac OS X 中对逗号分隔的值列表进行排序的最简单方法是什么:

输入:“a, b, aaa, bc”

输出:“a, aaa, b, bc”

我想从终端执行此操作,以便将输出通过管道传输到另一个命令。

【问题讨论】:

  • 这是一个完整的 CSV(即,由换行符和引用值分隔的记录可以包含逗号)还是只是由逗号和空格分隔的值?
  • 好问题,只是用逗号和空格分隔的值。
  • 另外,我不关心是否区分大小写。所以“A”和“a”被认为是相同的。
  • 看起来像 sed + sort + sed 的组合就可以了,这是最好的方法吗?

标签: macos sorting shell


【解决方案1】:
$ echo "a, b, Aaa, bc" |egrep -o "[^, ]+" |sort -f | xargs |sed -e 's/ /, /g'

如果值包含空格:

$ echo "a, b, Aaa, bc" |egrep -o "[^, ][^,]*" |sort -f | xargs -I Q echo Q, | xargs

但是最后你会得到一个额外的“,”。

【讨论】:

  • man xargs 是很好的阅读,连接到find -print0 也是很好的基础知识。
【解决方案2】:
echo "a, b, Aaa, bc"|tr -s "[, ]" "\n"|sort|sed -e :a -e 'N;s/\n/,/;ba'

echo "a, b, Aaa, bc"| tr -s "[, ]" "\n"|sort|tr "\n" ","|sed 's/,$//'

【讨论】:

  • sed 部分出了点问题,不过我喜欢使用 tr。
  • 差不多了,除了逗号后面的空格丢失了。
【解决方案3】:
echo 'a, b, aaa, bc' | awk '{split($0, a, ", "); n = asort(a); for (i=1; i<=n; i++) {printf a[i]; if (i<n) printf ", "}}'

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-19
    • 1970-01-01
    • 1970-01-01
    • 2022-01-01
    • 2021-12-06
    • 2020-03-14
    相关资源
    最近更新 更多