Попробуйте это решение Perl
$ cat ginzburg.txt
123123, Shelf Life Test,f,Other,066900,Germany,809900,Chem CMI,066900,Europe
123123, Shelf Life Test,f,Other,066900,Poland,810000,Chem CMI,066900,APAC
123123, Shelf Life Test,f,Other,066900,Spain,810100,Chem CMI,066900,APAC
123123, Shelf Life Test,f,Other,066900,France,2810200,Chem CMI,066900,North America
456456,Ammonium Citrus Esther,f,SupraTex Chem Analysis, 475000, Nigeria,814600,Chem Sensory,129475,MEA (Middle East and Africa)
789789,Archive 9 BASES II,f,HydroCare,066900,Belgium,211500,Chem CMI,066900,CIS (Commonwealth of Independent States)
$ perl -F, -lanE ' $x=join(",",@F[0..4]);$kv{$x}=join(",",@F[6..8]);@t=@{$kv2{$x}};push(@t,$F[5]);$kv2{$x}=[@t]; @p=@{$kv3{$x}};push(@p,$F[-1]);$kv3{$x}=[@p]; END { for(keys %kv) { %tv=(); %tv=map{ Попробуйте это решение Perl
[110]=>1} @{$kv3{ Попробуйте это решение Perl
[110]}};print " Попробуйте это решение Perl
[110] ",join("%%",@{$kv2{ Попробуйте это решение Perl
[110]}})," ",$kv{ Попробуйте это решение Perl
[110]},",",join("%%",keys %tv) } } ' ginzburg.txt
456456,Ammonium Citrus Esther,f,SupraTex Chem Analysis, 475000 Nigeria 814600,Chem Sensory,129475,MEA (Middle East and Africa)
123123, Shelf Life Test,f,Other,066900 Germany%%Poland%%Spain%%France 2810200,Chem CMI,066900,Europe%%North America%%APAC
789789,Archive 9 BASES II,f,HydroCare,066900 Belgium 211500,Chem CMI,066900,CIS (Commonwealth of Independent States)
$
Отредактировать первые 10 строк
sed -i -e '1,10s/ /_/g'
В Perl можно использовать триггерный оператор в скалярном контексте:
perl -i -pe 's/ /_/g if 1 .. 10'
Я не думаю, что Вы хотите использовать любое решение, которое требует, чтобы данные были записаны в новый файл.
Если Вы вполне уверены, что все, в чем Вы нуждаетесь, должно изменить пробелы в символы нижнего подчеркивания в первой строке файлов крупного текста, только необходимо считать первую строку, подкачать символы и записать ее обратно на месте:
#!/usr/bin/env perl
use strict;
my $filename = shift;
open (FH, "+< $filename") || die "can't open $filename: $!";
my $line = <FH>;
$line =~ s/ /_/g;
seek FH, 0, 0; # go back to the start of the file
printf FH $line;
close FH;
Для использования его просто передайте полный путь файла для обновления:
# fixheader "/path/to/myfile.txt"
Вы вряд ли заметите любое различие в скорости между Perl, Python и sed. Ваш сценарий проведет большую часть своего времени, ожидая IO.
Если строки являются той же длиной, можно отредактировать оперативный, иначе необходимо будет создать новый файл.
В Perl:
#!/usr/bin/env perl
use strict;
my $filename = shift;
open my $in_fh, '<', $filename
or die "Cannot open $filename for reading: $!";
my $first_line = <$in_fh>;
open my $out_fh, '>', "$filename.tmp"
or die "Cannot open $filename.tmp for writing: $!";
$first_line =~ s/some translation/goes here/;
print {$out_fh} $first_line;
print {$out_fh} $_ while <$in_fh>; # sysread/syswrite is probably better
close $in_fh;
close $out_fh;
# overwrite original with modified copy
rename "$filename.tmp", $filename
or warn "Failed to move $filename.tmp to $filename: $!";
изменение, которое Вы упоминаете (замена каждого пространства подчеркиванием) не изменяет длину строки, таким образом, в теории это могло быть сделано оперативное.
предупреждение!: непротестированный!
head -n 1 yourfile | sed -e 's/ /_/g' > tmpfile
dd conv=nocreat,notrunc if=tmpfile of=yourfile
я не так уверен в conv=...
параметры, но кажется, что это должно сделать dd
перезапишите запуск исходного файла с преобразованной строкой.
обратите внимание на то, что, если Вы хотите сделать какое-либо другое преобразование, которое могло бы изменить длину строки, не делайте, не делайте этого. необходимо было бы сделать полную копию. что-то вроде этого:
head -n 1 yourfile | sed -e 's/ /_/g' > tmpfile
tail -n + 2 | cat tmpfile - > transformedfile
Это могло быть решением:
use Tie::File;
tie my @array,"Tie::File","path_to_file";
$array[0] = "new text";
untie @array;
Связь:: Файл является одним из модулей, я использую большинство, и это очень просто в использовании. Каждый элемент в массиве является строкой в файле. Одна из оборотных сторон, однако, была бы то, что это загружает целый файл в памяти.