根据命令sort
的手册
-k, --key=POS1[,POS2]
start a key at POS1, end it at POS2 (origin 1)
版本:
GNU coreutils 5.93
MAC OSX 10.11.6
GNU bash 3.2.57(1)
2.6.1
了解如何使用此选项并不能帮助我。我见过-k1 -k2
和-k1,2
(请参阅this post,-k1.2
和-k1.2n
(请参阅this post)和{{1} }(请参阅this post)。
标志-k3 -k1 -k4
对命令--key (-k)
的作用是什么?
对于使用选项sort
可以做什么,我只有一个模糊的直觉,但是如果方便地考虑一个示例,我很乐意考虑使用数字(-k
)对选项进行排序。输入后紧跟“行”一词之后的数字。如果两个记录在单词“ row”之后具有相同的值,则可以对字母“ G”之后的值进行数字排序。
-n
预期输出为
H3_row24_G500.txt
H3_row32_G1000.txt
H3_row9_G999.txt
H3_row9_G1000.txt
H3_row24_G999.txt
H3_row102_G500.txt
H3_row2400_G999.txt
H3_row68_G999.txt
H3_row68_G500.txt
答案 0 :(得分:2)
.
在单个字段中指定起始位置。您想对字段2(从字符4开始)和字段3(从字符2开始)进行数字排序。以下应该起作用:
sort -t_ -k2.4n -k3.2n tmp.txt
-t_
指定字段分隔符2.4n
3.2n
从技术上讲,.txt
是字段3的一部分,但是当您要求数字排序时,尾随的非数字字符将被忽略。
(更正确地说,-k2.4,2n -k3.2,3n
可以防止在每个键中包含任何其他字段;我认为上面显示的更简单的形式是可行的,因为任何重叠都被“覆盖”了。n
可以防止字段3本身就不会被视为数字,并且没有字段4。)
答案 1 :(得分:1)
来自联机帮助页
KEYDEF is F[.C][OPTS][,F[.C][OPTS]] for start and stop position, where F is a field number
and C a character position in the field; both are origin 1, and the stop position defaults
to the line's end. If neither -t nor -b is in effect, characters in a field are counted
from the beginning of the preceding whitespace. OPTS is one or more single-letter order‐
ing options [bdfgiMhnRrV], which override global ordering options for that key. If no key
is given, use the entire line as the key. Use --debug to diagnose incorrect key usage.
含义是排序将行分成多个字段。句点分隔符用于偏移字段。使用_
作为分隔符,您将使用4的偏移量。
在这种情况下,字段分隔符不是空格,因此您需要使用-t
选项进行指定。
sort默认使用基于语言环境的搜索,看起来您希望这些内容按数字进行排序。 -n开关执行此操作。
sort -t _ -k 2.4 -n
答案 2 :(得分:1)
这实际上不是编程问题,但这是:
如果您使用的是GNU排序,则可以通过sort -V
实现所需的输出:
$ echo 'H3_row24_G500.txt
H3_row32_G1000.txt
H3_row9_G999.txt
H3_row9_G1000.txt
H3_row24_G999.txt
H3_row102_G500.txt
H3_row2400_G999.txt
H3_row68_G999.txt
H3_row68_G500.txt' | sort -V
H3_row9_G999.txt
H3_row9_G1000.txt
H3_row24_G500.txt
H3_row24_G999.txt
H3_row32_G1000.txt
H3_row68_G500.txt
H3_row68_G999.txt
H3_row102_G500.txt
H3_row2400_G999.txt
这是因为-V
compares numeric and general string segments separately和H
,3
,_row
在所有行中都是相同的。