perl -F, -ane '`echo $_ >> $F[2].csv`' < file
Используются следующие параметры командной строки:
-n
цикл вокруг каждой строки входного файла
-l
удаляет символы новой строки перед обработкой и добавляет их обратно
-a
режим автоматического разделения - разбить входные строки на массив @F
. По умолчанию расщепление по пробелам.
-e
выполнить код perl
-F
модификатор autosplit, в этом случае разделяется на ,
@F
- массив слов в каждой строке, проиндексированный, начиная с $F[0]
Если вы хотите сохранить заголовок, требуется более сложный подход.
perl splitintofiles.pl file
Содержимое splitintofiles.pl:
open $fh, '<', $ARGV[0];
while ($line = <$fh>) {
print $line;
if ($. == 1) {
$header = $line;
} else {
# $fields[2] is the 3rd column
@fields = split /,/, $line;
# save line into hash %c
$c{"$fields[2].csv"} .= $line;
}
}
close $fh;
for $file (keys %c) {
print "$file\n";
open $fh, '>', $file;
print $fh $header;
print $fh $c{$file};
close $fh;
}
ввод:
a,b,c,d,e,f,g,h,i,j,k,l
19980102,,PLXS,10032,Q,A,,,15.12500,15.00000,15.12500,2
19980105,,PLXS,10032,Q,A,,,14.93750,14.75000,14.93750,2
19980106,,PLXS,10032,Q,A,,,14.56250,14.56250,14.87500,2
20111222,,PCP,63830,N,A,,,164.07001,164.09000,164.12000,1
20111223,,PCP,63830,N,A,,,164.53000,164.53000,164.55000,1
20111227,,PCP,63830,N,A,,,165.69000,165.61000,165.64000,1
вывод PCP.csv
a,b,c,d,e,f,g,h,i,j,k,l
20111222,,PCP,63830,N,A,,,164.07001,164.09000,164.12000,1
20111223,,PCP,63830,N,A,,,164.53000,164.53000,164.55000,1
20111227,,PCP,63830,N,A,,,165.69000,165.61000,165.64000,1
вывод PLXS.csv
a,b,c,d,e,f,g,h,i,j,k,l
19980102,,PLXS,10032,Q,A,,,15.12500,15.00000,15.12500,2
19980105,,PLXS,10032,Q,A,,,14.93750,14.75000,14.93750,2
19980106,,PLXS,10032,Q,A,,,14.56250,14.56250,14.87500,2