다음과 같은 큰 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
$1
10으로 나눌 수 있을 때 마다 변수가 증가 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, ...
단순히 증가시키는 또 다른 방법은 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