5

使用するsort (coreutils) 5.2.1

次のファイルがあり、フィールド 4 の整数以外の部分で並べ替えたいと考えています。これは、負または正の数である可能性があり、値 INF を持つこともあります。

field1 field2 field3 tag=INF field5 field6
field1 field2 field3 tag=INF field5 field6
field1 field2 field3 tag=0.123 field5 field6
field1 field2 field3 tag=4.22 field5 field6
field1 field2 field3 tag=5.77 field5 field6
field1 field2 field3 tag=-1.92 field5 field6
field1 field2 field3 tag=-1.91 field5 field6
field1 field2 field3 tag=INF field5 field6

これを次のように並べ替えたい

field1 field2 field3 tag=-1.92 field5 field6
field1 field2 field3 tag=-1.91 field5 field6
field1 field2 field3 tag=0.123 field5 field6
field1 field2 field3 tag=4.22 field5 field6
field1 field2 field3 tag=5.77 field5 field6
field1 field2 field3 tag=INF field5 field6
field1 field2 field3 tag=INF field5 field6
field1 field2 field3 tag=INF field5 field6

フィールドの数値部分が文字位置 4 にあることを考えると (インデックスが 0 から始まると仮定すると、これはよくわかりません)、sort次のオプションを試してみました。

  • sort -g -k4.4 inputfile
  • sort -g -k4.5 inputfile
  • sort -n -k4.4 inputfile
  • sort -n -k4.5 inputfile
  • sort -g inputfile

これらはすべて次の結果をもたらします。これは近いですが、完全には正しくありません。マグニチュードは正しくソートされていますが、一番上に最も負の値が必要です。

field1 field2 field3 tag=0.123 field5 field6
field1 field2 field3 tag=-1.91 field5 field6
field1 field2 field3 tag=-1.92 field5 field6
field1 field2 field3 tag=4.22 field5 field6
field1 field2 field3 tag=5.77 field5 field6
field1 field2 field3 tag=INF field5 field6
field1 field2 field3 tag=INF field5 field6
field1 field2 field3 tag=INF field5 field6

どうすればsort振る舞うことができますか?

FWIW、詳細は次のとおりです。

LANG = en_US.UTF-8
Red Hat Enterprise Linux WS release 4 (Nahant Update 6)
4

2 に答える 2

1

You could add a pre-processing awk step that adds a new field at the end containing the numeric portion or the numeric representation from field 4, and sort by this field. Add a post-processing step to strip this field. Note that in the example below, INF has been set to an arbitrary high value of 10**10, you can set it to a higher value if you have a naturally occurring number in the input that exceeds this value

awk '{x=$4; sub("tag=", "", x); sub("INF", 10**10, x); print $0, x}' file.txt |
sort -k7,7g | 
cut -f-6 -d' '
field1 field2 field3 tag=-1.92 field5 field6
field1 field2 field3 tag=-1.91 field5 field6
field1 field2 field3 tag=0.123 field5 field6
field1 field2 field3 tag=4.22 field5 field6
field1 field2 field3 tag=5.77 field5 field6
field1 field2 field3 tag=INF field5 field6
field1 field2 field3 tag=INF field5 field6
field1 field2 field3 tag=INF field5 field6
于 2013-10-23T18:06:11.697 に答える