2

我想按 id 列对 unix 文件进行排序,但是当我使用 sort -k4,4 或 -k4,4n 时,我没有得到预期的结果。

感兴趣的列应该这样排序:

id1
id2
id3
id4
etc.

相反,当我对 -k4,4 进行排序时,它是这样排序的

id1
id10
id100
id1000
id10000
id10001
etc.

我的 unix 版本使用以下排序功能:

sort --help
Usage: sort [OPTION]... [FILE]...
Write sorted concatenation of all FILE(s) to standard output.

Mandatory arguments to long options are mandatory for short options too.
Ordering options:

  -b, --ignore-leading-blanks  ignore leading blanks
  -d, --dictionary-order      consider only blanks and alphanumeric characters
  -f, --ignore-case           fold lower case to upper case characters
  -g, --general-numeric-sort  compare according to general numerical value
  -i, --ignore-nonprinting    consider only printable characters
  -M, --month-sort            compare (unknown) < `JAN' < ... < `DEC'
  -n, --numeric-sort          compare according to string numerical value
  -r, --reverse               reverse the result of comparisons

Other options:

  -c, --check               check whether input is sorted; do not sort
  -k, --key=POS1[,POS2]     start a key at POS1, end it at POS2 (origin 1)
  -m, --merge               merge already sorted files; do not sort
  -o, --output=FILE         write result to FILE instead of standard output
  -s, --stable              stabilize sort by disabling last-resort comparison
  -S, --buffer-size=SIZE    use SIZE for main memory buffer
  -t, --field-separator=SEP  use SEP instead of non-blank to blank transition
  -T, --temporary-directory=DIR  use DIR for temporaries, not $TMPDIR or /tmp;
                              multiple options specify multiple directories
  -u, --unique              with -c, check for strict ordering;
                              without -c, output only the first of an equal run
  -z, --zero-terminated     end lines with 0 byte, not newline
      --help     display this help and exit
      --version  output version information and exit
4

3 回答 3

2

使用-Vor--version-sort选项进行版本排序

sort -V -k4,4 file.txt

例子:

$ cat file.txt
id5
id3
id100
id1
id10

输出:

$ sort -V file.txt
id1
id3
id5
id10
id100

编辑:

如果您的实现sort没有-V选项,则使用sedto remove的解决方法可以完成id数字排序,然后用 替换回来,如下所示:-nidsed

sed -E 's/id([0-9]+)/\1/' file.txt | sort -n -k4,4 | sed -E 's/( *)([0-9]+)( *|$)/\1id\2\3/'

注意:此解决方案取决于数据,仅当在 ID 列之前没有找到包含纯数字的列时才有效。

于 2012-11-19T13:10:41.287 回答
2

正如sudo_o 已经提到的那样,最简单的方法是使用--version-sortwhich 对文本中出现的数字进行自然排序。

如果您的版本sort没有该选项,则解决此问题的一种方法是在排序之前暂时删除“id”前缀,然后替换它们。这是使用 awk 的一种方法:

awk 'sub("^id", "", $4)' file.txt | sort -k4,4n | awk 'sub("^", "id", $4)'
于 2012-11-19T13:41:15.440 回答
1

如果您sort支持它,您还可以使用语法 FC 来使用字段中的特定字符。

这将对字段 4 进行排序,从字符 3 到 10,数值:

sort -bn -k 4.3,4.10 file

这将对字段 4 进行排序,从字符 3 到字段结尾,数值:

sort -bn -k 4.3,4 file
于 2012-11-19T16:42:14.567 回答