Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Shell 按同一列的两个子字符串进行排序,但只反转一个子字符串_Shell_Sorting_Unix_Fish - Fatal编程技术网

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或两者都指定。”因此,我认为默认情况下反转将适用于所有领域。