最初の列がnの倍数になるようにCSVファイルを分割する方法

最初の列がnの倍数になるようにCSVファイルを分割する方法

次のような大きなCSVファイルがあります。

1 , aaa, bbb, ...

1 , ccc, ddd, ...

2 , aaa, bbb, ...

..

10 , aaa, bbb, ...

..

1000 , aaa, bbb, ...

たとえば、最初の列が最大nの倍数かどうかに応じて別々のcsvファイルに分割したいとします。 n=10 の場合:

0.csv には以下が含まれます。

1 , aaa, bbb, ...

1 , ccc, ddd, ...

2 , aaa, bbb, ...

..

10 , aaa, bbb, ...

1.csvには以下が含まれます。

11 , ccc, ddd, ...

12 , aaa, bbb, ...

12 , aaa, bbb, ...

..

20 , aaa, bbb, ...

問題は、各ファイルに何行を割り当てるべきかを事前に知ることができず、awkを使用して最初の列を整数に一致させるのと同じくらい簡単ではないことです。

私はこれが私が望むものに最も近いことを知っています。

awk -F ',' '!seen[$1]++{f=$1".csv"; print h > f};{f=$1".csv"; print >> f; close(f)}' file.csv

しかし、これは最初の列値にのみ分割され、あまりにも多くのファイルが生成されるため、n個にわたって複数のファイルにグループ化したいと思います。

ベストアンサー1

awkのモジュラスまたは演算子を使用する必要があります%

例えば

$ awk -F, 'BEGIN { group=0; f="0.csv"};
           $1 % 10 == 0 && !seen[$1]++ {group++; f=group".csv"};
           { print >> f}' input.txt

$110で割ることができるたびに変数が増え、group一致するように出力ファイル名が更新されます。

次の入力ファイルを使用します。

$ cat input.txt 
1 , aaa, bbb, ...
1 , ccc, ddd, ...
2 , aaa, bbb, ...
10 , aaa, bbb, ...
11 , aaa, bbb, ...
12 , aaa, bbb, ...
20 , aaa, bbb, ...
21 , aaa, bbb, ...
22 , aaa, bbb, ...
30 , aaa, bbb, ...
31 , aaa, bbb, ...
32 , aaa, bbb, ...
40 , aaa, bbb, ...
41 , aaa, bbb, ...
42 , aaa, bbb, ...
50 , aaa, bbb, ...
51 , aaa, bbb, ...
52 , aaa, bbb, ...
60 , aaa, bbb, ...
61 , aaa, bbb, ...
62 , aaa, bbb, ...
70 , aaa, bbb, ...
71 , aaa, bbb, ...
72 , aaa, bbb, ...
1000 , aaa, bbb, ...

次の出力ファイルが生成されます。

$ head *.csv
==> 0.csv <==
1 , aaa, bbb, ...
1 , ccc, ddd, ...
2 , aaa, bbb, ...

==> 1.csv <==
10 , aaa, bbb, ...
11 , aaa, bbb, ...
12 , aaa, bbb, ...

==> 2.csv <==
20 , aaa, bbb, ...
21 , aaa, bbb, ...
22 , aaa, bbb, ...

==> 3.csv <==
30 , aaa, bbb, ...
31 , aaa, bbb, ...
32 , aaa, bbb, ...

==> 4.csv <==
40 , aaa, bbb, ...
41 , aaa, bbb, ...
42 , aaa, bbb, ...

==> 5.csv <==
50 , aaa, bbb, ...
51 , aaa, bbb, ...
52 , aaa, bbb, ...

==> 6.csv <==
60 , aaa, bbb, ...
61 , aaa, bbb, ...
62 , aaa, bbb, ...

==> 7.csv <==
70 , aaa, bbb, ...
71 , aaa, bbb, ...
72 , aaa, bbb, ...

==> 8.csv <==
1000 , aaa, bbb, ...

単に増やすもう1つの方法はgroup同じものにすることです$1 / 10。例えば

$ awk -F, '{ group = int($1 / 10); f=group".csv" ; print >> f }' input.txt

nハードコーディングの代わりにコマンドラインで指定するには、次の手順を実行します。

$ awk -F, 'BEGIN { group=0; f="0.csv"};
           $1 % n == 0 && !seen[$1]++ {group++; f=group".csv"};
           { print >> f}' n=5 input.txt

おすすめ記事