

ディレクトリ内にある複数の行列データが保存されたタブ区切りの”複数の”ファイル(以下、datファイル)から、ある特定の行を取り出し、
**取り出した順に行データを並べて新たにdatファイル** を作りたいです。  
Python/シェルスクリプト/C どれで作ると良いでしょうか。datデータはLinuxのディレクトリ内にあります。

求めている手法の「最適」条件  
Linux上のディレクトリで動作する言語（導入しやすい言語_ex.>pythonの場合はpythonスクリプトで書く必要がある？）、プログラムが簡易、処理速度が早い

## datファイルの形式

タブで区切られた小数点数の行列データからなるテキストファイルです。最初の行がアルファベットや記号で列データの見出しになっています。その各見出しの下に小数点数が数百並んでいるデータになります。

[code]

    # x y z  
    1.0 2.1 -5.4 8.2
    0.0 23.4 4.4 3.4
    ... (以下数百行続く)
    
[/code]

追記(2018/06/30)

# タブではなく、複数スペースによる区切りファイルでした。

#[スペース18個]x[スペース19個]y[スペース19個]z  
[スペース6個]1.0[スペース5個]2.1[スペース5個]-5.4[スペース5個]8.2  
[スペース6個]0.0[スペース5個]23.4[スペース5個]4.4[スペース5個]3.4

... (以下数百行続く)


CC BY-SA 4.0
2018-06-11T14:27:11.763
44701
2018-06-30T09:40:21.607
2018-06-30T09:40:21.607
28901
28901
question
python c shellscript
複数のタブ区切りファイルに対して同じ行を取り出して新たなフォルダにまとめるのに最適な言語


datファイルがタブ区切りファイルであれば、シェルスクリプトが良いと思います。

[タブ区切りファイルの例](https://en.wikipedia.org/wiki/Tab-separated_values) を org.dat
とした場合、  
以下のシェルコマンドで組みあわせで、列を抽出しソートできます。  
(3列目を抽出しソートする場合)

[code]

    # .(カレントディレクトリ)配下のdatファイルからヘッダ部を取り除き1つにまとめ,
    # 3列目を抽出, ソート
    # 結果をnew.datに保存
    find . -type f -name "*.dat" -exec tail -n +2 {} \; | cut -f 3 | sort -n > new.dat
    
[/code]


CC BY-SA 4.0
2018-06-11T15:04:25.513
44704
2018-06-12T04:34:47.207
2018-06-12T04:34:47.207
44701
answer


Python3だと以下のように書けます。python/シェルスクリプト/C どれで作るかは好みの問題だけでしょう。

[code]

    from pathlib import Path
    import pandas as pd
    
    dfs = (pd.read_csv(f, delim_whitespace=True)['x'] for f in Path('.').glob('*.dat'))
    pd.concat(dfs, ignore_index=True).sort_values().to_csv('all.dat', sep='\t', index=False)
    
[/code]


CC BY-SA 4.0
2018-06-12T03:52:32.140
44714
2018-06-12T17:02:53.433
2018-06-12T17:02:53.433
15171
15171
44701
answer


あくまで一般論になりますが、生産性の高さと、処理速度が速いことが トレードオフの関係なので、楽に作りたいのであれば、まずはシェルスクリプトが良いと思います。

ただ、例えば、dat
ファイルが数万ファイルある、もしくは、容量がすごく大きいといった場合は、「処理経過をログに出力したい」など、他の要件がでてくるかもしれません。

そういった「想定外の要件に対応すること」も想定すると、Pythonなどのプログラミング言語のほうがいろいろ出来るので良い気がします。

生産性を重視する場合は、積極的に C を選択する理由は思いつきませんが、処理速度やメモリの効率化が重要な場合は、C を選ぶのがいいと思います。


CC BY-SA 4.0
2018-06-12T10:55:10.687
44719
2018-06-12T10:55:10.687
5008
44701
answer