“ --key(-k)”如何用于命令“ sort”?

时间:2018-09-28 17:07:08

标签: sorting command-line

根据命令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

3 个答案:

答案 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 separatelyH3_row在所有行中都是相同的。