按同一列的两个子串排序,只有一个反转
Sorting by two substrings of the same column with only one reversed
我有一个如下所示的文件:
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
,您可以通过两个 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
选项将确保将排序限制在该列而不是继续到行尾。
我有一个如下所示的文件:
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
,您可以通过两个 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
选项将确保将排序限制在该列而不是继续到行尾。