2

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

/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/

排序算法必须先获取 last 之前的字符串/,即:

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/ 
4

2 回答 2

3

您可以在预处理步骤中使用sort来添加 3 列,全部基于感兴趣的字段 feed to ,然后用于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/
于 2013-11-13T02:56:39.523 回答
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是你的文件名。

于 2013-11-13T03:15:20.057 回答