帮助使用sort排序文件

时间:2011-05-28 18:19:34

标签: bash sorting

我有这个文件:

100: pattern1
++++++++++++++++++++
1:pattern2
9:pattern2
+++++++++++++++++++
79: pattern1
61: pattern1
+++++++++++++++++++

我想按照这样排序:

++++++++++++++++++++
1:pattern2
9:pattern2
+++++++++++++++++++
61:pattern1
79:pattern1
100:pattern1
+++++++++++++++++++

是否可以仅使用Linux排序命令?

如果我有:

4:pat1 
3:pat2
2:pat2
1:pat1

O / p应该是:

1:pat1
++++++++++++ 
2:pat2
3:pat2
++++++++++++
4:pat1

所以,想要对第一组进行排序,而对第二组的模式进行“分组”。 请注意,之后的事情是正则表达式而不是文字。

4 个答案:

答案 0 :(得分:1)

您可以做的最好是根据数值对其进行排序。但你不能用“+” - 字符串做任何事情。

$ sort -n input
+++++++++++++++++++
+++++++++++++++++++
++++++++++++++++++++
1:wow
9:wow
61: this is it
79: this is it
100: this is it

答案 1 :(得分:0)

可能不是 - 它不是 sort(1)所期望的那种格式。如果你这样做,那将是一个令人惊讶的黑客,不容易使用。如果你对加号的行之间有什么规则,你可以使用AWK或Perl或Python脚本轻松完成。

答案 2 :(得分:0)

如果您的输入是空格分隔的,而不是':'分隔:

sort  -rk2 | uniq -D -f1

将进行分组;

  • 我猜您以后需要对'子部分'进行排序(不幸的是我的sort(1)没有进行复合键排序。我相信有一个版本允许您sort -k2,1n和你一起“马上完成。”
  • 使用--all-repeated=separate代替-D来获取组之间的空白分隔符。请查看man uniq以获取更多想法!

但是,由于您的输入是冒号分隔的,因此需要进行黑客攻击:

sed 's/\([0123456789]\+\):/\1 /' t | sort  -rk2 | uniq -D -f1

HTH

答案 3 :(得分:0)

我不相信sort能够做到你所需要的。

创建一个新的shell脚本并将其放在其内容中(即mysort.sh):

#!/bin/sh
IFS=$'\n' # This makes the for loop below split on newline instead of whitespace.
delim=+++++++++++++++++++
for l in `grep -v ^+| sort -g`      # Ignore all + lines and sort by number
do
    current=`echo $l | sed s/^[0-9]*://g` # Get what comes after the number
    if [ ! -z "$prev" ] && [ "$prev" != "$current" ] # If it has changed...
    then                                  #  then output a ++++ delimiter line.
        echo $delim
    fi
    prev=$current
    echo $l                               # Output this line.
done

要使用它,请在文件内容中输入管道,如下所示:

cat input | sh mysort.sh