Linux - CSV データのソート!

Updated:


Linux で CSV データをソートする方法についての記録です。

0. 前提条件

  • LMDE 3 (Linux Mint Debian Edition 3; 64bit) での作業を想定。(他の Linux ディストリビューションでも同様のはず)

1. CSV ファイルの準備

ソートに使用する CSV データ(ファイル)は、以下のような内容とする。
(この例では、データは全て2019年6月22日分。但し、文字列としてソートされているため、時・分・秒・ナノ秒の並びが気に入らない)

File: test.csv

年,月,日,時,分,秒,秒以下[ナノ秒],緯度,経度
2019,6,22,0,0,52,742255119,36.2951,133.5592
2019,6,22,0,1,10,360919063,35.9735,133.1688
2019,6,22,0,1,33,131445817,36.2947,133.5410
2019,6,22,0,1,33,131621079,36.3374,133.5314
2019,6,22,0,1,33,131730443,36.2996,133.3779
2019,6,22,0,1,33,304507343,36.3103,133.5052
2019,6,22,0,10,3,442331076,36.3377,133.6185
2019,6,22,0,10,3,444310399,36.3687,133.6207
2019,6,22,0,10,42,594407302,36.0316,133.3392
2019,6,22,0,11,10,905628211,36.0301,133.3683
      :
===< 中略 >===
      :
2019,6,22,0,19,33,509865021,36.0341,133.4350
2019,6,22,0,19,33,568154738,36.0283,133.4362
2019,6,22,0,19,33,659982903,36.0282,133.4363
2019,6,22,0,19,48,332025744,36.0642,133.4004
2019,6,22,0,2,19,140519626,36.0323,133.3255
2019,6,22,0,2,19,185271431,35.9970,133.3679
2019,6,22,0,2,19,186265484,36.0245,133.3413
2019,6,22,0,2,19,387917907,36.0011,133.3676
      :
===< 後略 >===
      :

2. 使用例

4〜7列目(時〜ナノ秒)を数値とみなしてソートする例。

$ sort -t "," -k 4,4n -k 5,5n -k 6,6n -k 7,7n test.csv > test_sorted.csv
  • -t は区切り文字を指定するオプション。
    • -t --field-separator= としてもよい
  • -k はソートする列番号指定するオプション。
    • -k 4,4n で、4列目から4列目を数値とみなしてソート。
    • -k 4n だと、4列目から最終列を(数値以外の文字列を除外して)数値とみなしてソートしてしまうので、注意。
    • -k 4,6n だと、4列目から6列目をまとめて(数値以外の文字列を除外して)数値とみなしてソートしてしまうので、注意。
    • -k --key= としてもよい。
  • ヘッダ行に数値があると、それもソートされてしまうので、注意。

その他、よく使用するであろうオプション。

  • -f, --ignore-case は大/小文字を区別せずにソートするオプション。
  • -r, --reverse は逆順にソートするオプション。

3. 結果確認

ソート後のデータ(ファイル)を確認してみる。

File: test_sorted.csv

年,月,日,時,分,秒,秒以下[ナノ秒],緯度,経度
2019,6,22,0,0,52,742255119,36.2951,133.5592
2019,6,22,0,1,10,360919063,35.9735,133.1688
2019,6,22,0,1,33,131445817,36.2947,133.5410
2019,6,22,0,1,33,131621079,36.3374,133.5314
2019,6,22,0,1,33,131730443,36.2996,133.3779
2019,6,22,0,1,33,304507343,36.3103,133.5052
2019,6,22,0,2,19,140519626,36.0323,133.3255
2019,6,22,0,2,19,185271431,35.9970,133.3679
2019,6,22,0,2,19,186265484,36.0245,133.3413
2019,6,22,0,2,19,387917907,36.0011,133.3676
2019,6,22,0,2,19,387986811,36.1129,133.3816
      :
===< 中略 >===
      :
2019,6,22,0,4,44,407918890,36.0343,133.3725
2019,6,22,0,4,44,443029891,36.0693,133.3188
2019,6,22,0,5,3,143444634,36.0098,133.3240
2019,6,22,0,5,3,322006074,36.0639,133.2525
2019,6,22,0,5,3,324683247,36.0015,133.3228
2019,6,22,0,5,3,460229408,36.0043,133.3213
2019,6,22,0,5,10,284162493,36.0294,133.3776
2019,6,22,0,5,38,277787048,36.0473,133.3498
2019,6,22,0,5,43,920394309,36.0045,133.3220
2019,6,22,0,5,44,424041228,36.3349,133.7917
2019,6,22,0,5,44,424241997,36.3067,133.8020
2019,6,22,0,5,44,478318073,36.3102,133.7579
2019,6,22,0,6,9,476985152,36.2383,133.1780
2019,6,22,0,6,41,49010239,36.0469,133.3620
      :
===< 後略 >===
      :

4. その他

詳細は sort --helpman sort で確認可能。


何かと応用できるでしょう。

以上。





 

Sponsored Link

 

Comments