如何在bash中排序?

时间:2013-11-13 02:42:21

标签: bash

我在文件中有几行,如下所示:

/adbc/eee/ddd/baa/
/adbc/fff/ddd/ccc/avfff/
/adbc/ccc/ddd/b/
/adbc/fff/ddd/c/
/adbc/ccc/ddd/bf/
/adbc/ccc/ddd/bc/

排序算法必须首先在最后/之前获取字符串,即:

baa
avfff
b
c
bf
bc

然后按第一个字符排序,然后按字符串的长度排序,然后按字母顺序排序。

预期结果是

/adbc/fff/ddd/ccc/avfff/
/adbc/ccc/ddd/b/
/adbc/ccc/ddd/bc/
/adbc/ccc/ddd/bf/
/adbc/eee/ddd/baa/
/adbc/fff/ddd/c/ 

2 个答案:

答案 0 :(得分:3)

您可以在预处理步骤中使用根据感兴趣的字段添加3列,将Feed添加到sort,然后使用cut丢弃额外的字段

awk -F'/' -v OFS="/" '{x=substr($(NF-1), 1, 1);
  print(x, length($(NF-1)), $(NF-1), $0)}' file.txt |
  sort -k1,1 -k2,2n -k3,3 -t'/' |
  cut -f4- -d'/'
/adbc/fff/ddd/ccc/avfff/
/adbc/ccc/ddd/b/
/adbc/ccc/ddd/bc/
/adbc/ccc/ddd/bf/
/adbc/eee/ddd/baa/
/adbc/fff/ddd/c/

答案 1 :(得分:1)

cat sortthisfile | while read line
do
    field=$( echo $line | sed -e 's:/$::' -e 's:.*/::' )
    firstchar=${field:0:1}
    fieldlen=${#field}
    echo "${firstchar},${fieldlen},${field},${line}"
done | sort-k1,1 -k2,2n -k3,3 -t, | sed 's:.*,/::'

显然,sortthisfile是您文件的名称。