Shell 按同一列的两个子字符串进行排序,但只反转一个子字符串
我有一个文件如下所示:Shell 按同一列的两个子字符串进行排序,但只反转一个子字符串,shell,sorting,unix,fish,Shell,Sorting,Unix,Fish,我有一个文件如下所示: 2836344588 ... ... N fs1q 2836344589 ... ... N fp2q 2836374222 ... ... N fp3q 2836374223 ... ... N fp6q 2836374224 ... ... N fp7q 2836384836 ... ... N fs2q 2836384837 ... ... N fp1q 2836384838 ... ... N fp4
2836344588 ... ... N fs1q
2836344589 ... ... N fp2q
2836374222 ... ... N fp3q
2836374223 ... ... N fp6q
2836374224 ... ... N fp7q
2836384836 ... ... N fs2q
2836384837 ... ... N fp1q
2836384838 ... ... N fp4q
2836384839 ... ... N fp5q
2836384957 ... ... N fs3q
2836384958 ... ... N fs7q
2836404416 ... ... N fs5q
2836414186 ... ... N fs6q
2836434267 ... ... N fs4q
我想按第五列的第二个和第三个字符对其进行排序:第二个字符的排序应按逆字母顺序进行(s
应排在p
之前),第三个字符的排序应按常规(即非逆)数字顺序进行
我认为我可以通过以下方式实现这一目标:
sort -k5.2r -k5.3n
但这导致:
2836384958 ... ... N fs7q
2836414186 ... ... N fs6q
2836404416 ... ... N fs5q
2836434267 ... ... N fs4q
2836384957 ... ... N fs3q
2836384836 ... ... N fs2q
2836344588 ... ... N fs1q
2836374224 ... ... N fp7q
2836374223 ... ... N fp6q
2836384839 ... ... N fp5q
2836384838 ... ... N fp4q
2836374222 ... ... N fp3q
2836344589 ... ... N fp2q
2836384837 ... ... N fp1q
其中,第五列的第三个字符的排序也是反向的
如何对该文件进行排序,以便只对第二个字符进行反向排序(所有的“s”行在所有的“p”行之前),而不对第三个字符进行反向排序?换句话说,我如何获得所需的输出:
2836344588 ... ... N fs1q
2836384836 ... ... N fs2q
2836384957 ... ... N fs3q
2836434267 ... ... N fs4q
2836404416 ... ... N fs5q
2836414186 ... ... N fs6q
2836384958 ... ... N fs7q
2836384837 ... ... N fp1q
2836344589 ... ... N fp2q
2836374222 ... ... N fp3q
2836384838 ... ... N fp4q
2836384839 ... ... N fp5q
2836374223 ... ... N fp6q
2836374224 ... ... N fp7q
非常感谢。因为反向标志适用于该命令中的所有
-k
,所以您可以通过两个排序
命令传递它,而不是同时尝试执行它们?(我将文本保存在文件s.txt
)中。使用-b
选项对我来说效果更好
[我还需要-s
选项,以使其不保持超出指定字段的排序。]
sort s.txt -n -k5.3,5.3 -b | sort -r -k5.2,5.2 -b -s
输出按第2列反向排序,然后按数字排序(我将输入文件修改为更可变)。需要使用,
指定开始和停止列。现在在第5个字段中,第二列排序为t->p,第三列排序为1->9
2836384837 ... ... N ft1q
2836404416 ... ... N ft5q
2836414186 ... ... N ft6q
2836344588 ... ... N bs1q
2836384836 ... ... N fs2q
2836384957 ... ... N fs3q
2836434267 ... ... N fs4q
2836384958 ... ... N cs7q
2836344589 ... ... N fp2q
2836374222 ... ... N fp3q
2836384838 ... ... N bp4q
2836384839 ... ... N fp5q
2836374223 ... ... N ap6q
2836374224 ... ... N fp7q
在这种情况下,两次指定位置并使用
-s
选项将确保将排序限制在该列,而不是继续到行尾。因为反向标志适用于该命令中的所有-k
,您可以通过两个sort
命令来执行它,而不是同时尝试执行它们?(我将文本保存在文件s.txt
)中。使用-b
选项对我来说效果更好
[我还需要-s
选项,以使其不保持超出指定字段的排序。]
sort s.txt -n -k5.3,5.3 -b | sort -r -k5.2,5.2 -b -s
输出按第2列反向排序,然后按数字排序(我将输入文件修改为更可变)。需要使用,
指定开始和停止列。现在在第5个字段中,第二列排序为t->p,第三列排序为1->9
2836384837 ... ... N ft1q
2836404416 ... ... N ft5q
2836414186 ... ... N ft6q
2836344588 ... ... N bs1q
2836384836 ... ... N fs2q
2836384957 ... ... N fs3q
2836434267 ... ... N fs4q
2836384958 ... ... N cs7q
2836344589 ... ... N fp2q
2836374222 ... ... N fp3q
2836384838 ... ... N bp4q
2836384839 ... ... N fp5q
2836374223 ... ... N ap6q
2836374224 ... ... N fp7q
在这种情况下,两次指定位置并使用-s
选项将确保将排序限制在该列,而不是继续到行的末尾。Man entry表示“其余的修饰符适用于整个键字段,无论它们是否仅用field1或field2或两者指定。”因此,我认为默认情况下反转将适用于所有领域。Man entry说“其余的修饰符适用于整个关键字段,无论它们是否仅使用field1或field2或两者都指定。”因此,我认为默认情况下反转将适用于所有领域。