첫 번째 열이 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, ...

단순히 증가시키는 또 다른 방법은 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

관련 정보