0

次のような情報を含むいくつかの大きな CSV ファイル (それぞれ約 20 MiB) があります。最初の列の日付に基づいて、このファイルを小さなファイルに分割する方法を見つけたいと思います。たとえば、次のセグメントは と の 2 つのファイルに分割され20130719.csvます20130720.csv

また、4 番目の列 (カラー タグ) に従って (小さなファイルごとに) 並べ替えたいと思います。これを行う方法について何か提案はありますか?

これらの種類のものを扱う際に知っておくべきことはありますか?

19/07/2013  19:14:24:523    6.35099E+17 Dr_Blue 10.42496014 27.17010689 0.685520172
19/07/2013  19:18:5:903 6.35099E+17 Dr_Yellow   11.09363079 28.57788467 2.010284424
19/07/2013  19:36:33:645    6.35099E+17 Dr_Blue 10.77513885 28.3723774  1.897870064
19/07/2013  21:29:36:762    6.35099E+17 Dr_Yellow   10.64018059 28.56962967 1.117245913
19/07/2013  21:29:37:627    6.35099E+17 Dr_Yellow   11.3354435  27.57170868 1.552354813
20/07/2013  2:34:28:2   6.35099E+17 Dr_Yellow   10.41067123 26.84050369 0.919301987
20/07/2013  2:34:28:840 6.35099E+17 Dr_Yellow   10.54369164 27.17712402 0.573934555
20/07/2013  2:34:33:192 6.35099E+17 Dr_Yellow   10.98471832 28.35677719 1.497600555
20/07/2013  4:20:28:246 6.35099E+17 Dr_Blue 10.92816448 28.55761147 2.187088013
4

2 に答える 2

2

これは単純化されたシェルバージョンです

IFS="$IFS/"
while read DAY MO YR A B C D E F || [ "$DAY" ]; do
  echo "$A $B $C $D $E $F" >> "$YR$MO$DAY.ssv"
done <infile

for x in *.ssv; do
  sort -k4 $x |tr " " "," > ${x%.ssv}.csv
  rm $x
done

その場で並べ替えるには、行の並べ替え方法によっては awk がより良い選択かもしれません

于 2013-10-02T05:17:06.920 に答える
0

「csplit」はほとんど必要なことを行いますが、分割する正規表現を記述するには日付範囲を知る必要があります (このルートをたどると、「head」と「tail」で簡単に取得できます。そうでない場合まだ awk ワンライナーがあることを知っておいてください:

{ print $0 > gensub(/\//, ".", "g", $1) ".csv"; }

$0 行全体を $1.csv という名前のファイルに入れます。日付が特殊文字を使って面白い方法で指定されている場合は、OS で受け入れられるようにマッサージする必要があるかもしれません。「gensub」はスラッシュをドットに置き換えます。

カラータグでのソートに関して: シェルユーティリティ 'sort -k4,4' を使用して、4 番目のフィールドでのみソートするように指定していますが、得られるアルファベット順は希望どおりではない場合があります。次に、再び「awk」がありますが、awk の動的配列を使用したソート (すべての行を配列にダンプし、END ルールで「asort」を呼び出します) は高速ではありません。

于 2013-10-02T03:01:19.877 に答える