开发者

help on sorting a file using sort

开发者 https://www.devze.com 2023-03-09 12:43 出处:网络
I have this file: 100: pattern1 ++++++++++++++++++++ 1:pattern2 9:pattern2 +++++++++++++++++++ 79: pattern1

I have this file:

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

and I want to sort it like this:

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

Is it possible using开发者_运维技巧 Linux sort command only ?

If I had :

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

O/p should be:

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

So, want to sort on first group, but "group" on the pattern of second group. Please note, the thing after : is a regex pattern not a literal.


Best you can do is to sort it according to the numerical values. But you cannot do anything with the "+"-string.

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


I don't believe sort alone can do what you need.

Create a new shell script and put this in its contents (ie 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

To use it, pipe in the contents of your file like so:

cat input | sh mysort.sh


Probably not -- it's not in the sort of format sort(1) expects. And if you did it would be one of those amazing hacks, not easily used. If you have some sort of rule for what goes between the lines of plus signs, you can do it readily enough with an AWK or Perl or Python script.


If your input was space delimited, not ':' delimited:

sort  -rk2 | uniq -D -f1

will do the grouping;

  • I guess you'd need to sort the 'subsections' later (unfortunately my sort(1) doesn't do composite key ordering. I do believe there are version that allow you to do sort -k2,1n and you'd be done at once).
  • use --all-repeated=separate instead of -D to get blank separators between groups. Look at man uniq for more ideas!

However, since your input is colon delimited, a hack is required:

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

HTH

0

精彩评论

暂无评论...
验证码 换一张
取 消