[英]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.