簡體   English   中英

使用 sort 對文件進行排序的幫助

[英]help on sorting a file using sort

我有這個文件:

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

因此,要對第一組進行排序,但對第二組的模式進行“分組”。 請注意,后面的內容: 是正則表達式模式而不是文字。

最好的辦法是根據數值對其進行排序。 但是你不能用“+”-string 做任何事情。

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

可能不是——它不是sort(1)期望的那種格式。 如果你這樣做了,那將是那些令人驚嘆的黑客之一,不容易使用。 如果您對加號行之間的內容有某種規則,則可以使用 AWK 或 Perl 或 Python 腳本輕松完成。

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

sort  -rk2 | uniq -D -f1

將進行分組;

  • 我想您以后需要對“小節”進行排序(不幸的是,我的sort(1)沒有進行復合鍵排序。我相信有允許您執行sort -k2,1n的版本,您就完成了立刻)。
  • 使用--all-repeated=separate而不是-D來獲取組之間的空白分隔符。 查看man uniq以獲得更多想法!

但是,由於您的輸入是冒號分隔的,因此需要 hack:

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

HTH

我不相信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

要使用它,文件內容中的 pipe 如下所示:

cat input | sh mysort.sh

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM