2

UNIXファイルをid列でソートしたいのですが、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

-Vバージョンの並べ替えにはor--version-sortオプションを使用します

sort -V -k4,4 file.txt

例:

$ cat file.txt
id5
id3
id100
id1
id10

Ouput:

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

編集:

の実装にオプションsortがない場合は、-V回避策を使用sedして削除idし、数値の並べ替えを実行してから、次のよう-nにに置き換えidます。sed

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-sortに、テキスト内で発生する数値を自然に並べ替える方法を使用するのが最も簡単です。

のバージョンにsortそのオプションがない場合、これにアプローチするためのハッキーな方法は、ソートの前に一時的に「id」プレフィックスを削除してから、それらを置き換えることです。awkを使用する1つの方法は次のとおりです。

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 に答える