我有这个文件:
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
所以,想要对第一组进行排序,而对第二组的模式进行“分组”。 请注意,之后的事情是正则表达式而不是文字。
答案 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