Ankur Agarwal
Ankur Agarwal

Reputation: 24758

help on sorting a file using sort

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.

Upvotes: 3

Views: 260

Answers (4)

namuol
namuol

Reputation: 9996

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

Upvotes: 0

sehe
sehe

Reputation: 392921

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

Upvotes: 0

Fredrik Pihl
Fredrik Pihl

Reputation: 45652

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

Upvotes: 1

Charlie Martin
Charlie Martin

Reputation: 112366

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.

Upvotes: 0

Related Questions