파일이 있습니다 sales_$date.csv
. 첫 번째 열(ITEM)의 마지막 숫자를 기준으로 10개의 파일로 분할하고 싶습니다. 그래서 실제로 파일은 sales_$date-01.csv
, sales_$date-02.csv
,.. 등 10개의 파일로 나누어지게 됩니다 . 또한 모든 파일의 헤더를 보존해야 합니다. 열 길이(ITEM) 값은 고정되어 있지 않습니다. 이 프로세스는 매일 45분마다 실행되어야 합니다. 아래는 예시입니다
sales_$date.csv파일: FILE=sales_$날짜 품목, 수량, 매장, BUYABLEFLAG 4000,1,13805,Y 4001,3,1456,N 5010,2,14534,Y 7200,5,14566,N 4002,2,6534534,N 5611 ,9,34234,Y 7832,32,6575,N
sales_$date-01.csv0으로 끝나는 항목 레코드가 있어야 합니다(첫 번째 열 ITEM 값 참조).
ITEM,QTY,STORE,BUYABLEFLAG
4000,1,13805,Y
5010,2,14534,Y
7200,5,14566,N
sales_$date-02.csv1로 끝나는 항목 레코드가 있어야 합니다(첫 번째 열 ITEM 값 참조).
ITEM,QTY,STORE,BUYABLEFLAG
4001,3,1456,N
5611,9,34234,Y
sales_$date-03.csv2로 끝나는 항목에 대한 레코드가 있어야 합니다(첫 번째 열 ITEM 값 참조).
ITEM,QTY,STORE,BUYABLEFLAG
4002,2,6534534,N
7832,32,6575,N
또한 모든 파일 이름(예: sales_date-01, sales_date-02, sales_date-03)은 FILE_NAME이라는 변수에 있습니다.
답변1
파일이 크지만 크지 않은 경우 다음 명령을 사용하여 파일을 10번 반복할 수 있습니다.
for digit in 0 1 2 3 4 5 6 7 8 9 ; do
egrep "^ITEM,|^...$digit" sales.csv >sales-0$digit.csv
done
답변2
단일 패스에서:
awk '
NR == 1 { for (i=1; i<=10; i++) print > sprintf("sales-%02d.csv", i) }
NR > 1 { print > sprintf("sales-%02d.csv", $1%10+1) }
' data
답변3
이것을 자세히 설명하겠습니다 perl
. 조금 길지만 그것이 무엇을 하는지 더 명확해지기를 바랍니다. 단일 패스로 작동하여 해당 줄의 "id"를 구문 분석하고 이를 기반으로 파일을 엽니다. 실제로 그럴 것이다아니요파일을 생성하세요. 그렇지 않으면 비어 있을 것입니다. 기능이라고 부르고 싶지만 마음에 들지 않으면 쉽게 변경할 수 있습니다.
#!/usr/bin/perl
use strict;
use warnings;
#read header row from STDIN or file specified on command line (like grep/sed/awk)
my $header = <>;
#set up file handles to write to
my %file_for;
#iterate STDIN or files on command line
while ( <> ) {
#get 'first digit before a comma' on current line.
my ( $file_id ) = /(\d),/;
#open the file, if we haven't already. (it auto closes at script exit)
if ( not defined $file_for{$file_id} ) {
open ( $file_for{$file_id}, '>', "sales-0".$file_id.".csv" ) or warn $!;
#print the header row
print {$file_for{$file_id}} $header;
}
#select this file for output, and print the current line.
select $file_for{$file_id} and print;
}