2番目の条件は、まず両方のフィールドをソートすることです。

2番目の条件は、まず両方のフィールドをソートすることです。

GNUソートを使用してファイル内の複数の列をソートしようとしています。

ソースファイルtmp/file.txtの形式は次のとおりです。

03A12345679   2014-09-30-00.00.01.00
  • "03" => 最初の列
  • "A" => フィールド区切り記号
  • "12345679" => 2番目の列
  • "2014-09-30-00.00.01.00" => その他の列(ソートされていない)

私は次のコマンドを試しました。

sort --field-separator="A" -k2,11 -k1,2 tmp/file.txt > tmp/file_out.txt

そして:

  • --field-separator="A"=> フィールド区切り記号は「A」です。
  • -k2,11=> 2番目の列は最初のソートです(「12345679」)。
  • -k1,2=>最初の列は2番目のソート( "03")です。

ただし、結果が誤ってソートされました(「03」は「01」行と「02」行の前にあります)。

03A12345679   2014-09-30-00.00.01.000000-0000
01A12345679   12345679  132132155VDVLDLV
02A12345679   FONDSEURO   000012664,120000000M
02A12345679   FR09999956570000009999,999990000F
01A12345680   472958519598601200000000047295824
02A12345680   122121EUR     0000099999,370000000M

私は次の結果が欲しい:

01A12345679   12345679  132132155VDVLDLV
02A12345679   FONDSEURO   000012664,120000000M
02A12345679   FR09999956570000009999,999990000F
03A12345679   2014-09-30-00.00.01.000000-0000
01A12345680   472958519598601200000000047295824
02A12345680   122121EUR     0000099999,370000000M

どうすればいいですか?

答え1

フィールド位置とキャラクター位置を混同していたようです。 GNUソートを使用すると、スペースでA区切られた最初のフィールドで一連の文字をソートできます。

$ sort -k1.4,1.11 -k1.1,1.2 file
01A12345679   12345679  132132155VDVLDLV
02A12345679   FONDSEURO   000012664,120000000M
02A12345679   FR09999956570000009999,999990000F
03A12345679   2014-09-30-00.00.01.000000-0000
01A12345680   472958519598601200000000047295824
02A12345680   122121EUR     0000099999,370000000M

答え2

以下を使用して並べ替え-g(標準数値比較基準):

sort --field-separator="A" -g -k2,11 -k1,2 tmp/file.txt > tmp/file_out.txt

関連情報