Как я могу внести изменения только в первую строку файла?

Попробуйте это решение 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
задан Benjamin W. 23 March 2016 в 00:33
поделиться

5 ответов

Отредактировать первые 10 строк

sed -i -e '1,10s/ /_/g'

В Perl можно использовать триггерный оператор в скалярном контексте:

perl -i -pe 's/ /_/g if 1 .. 10'
22
ответ дан 3 December 2019 в 13:51
поделиться

Я не думаю, что Вы хотите использовать любое решение, которое требует, чтобы данные были записаны в новый файл.

Если Вы вполне уверены, что все, в чем Вы нуждаетесь, должно изменить пробелы в символы нижнего подчеркивания в первой строке файлов крупного текста, только необходимо считать первую строку, подкачать символы и записать ее обратно на месте:

#!/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"
10
ответ дан 3 December 2019 в 13:51
поделиться

Вы вряд ли заметите любое различие в скорости между 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: $!";
5
ответ дан 3 December 2019 в 13:51
поделиться

изменение, которое Вы упоминаете (замена каждого пространства подчеркиванием) не изменяет длину строки, таким образом, в теории это могло быть сделано оперативное.

предупреждение!: непротестированный!

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
4
ответ дан 3 December 2019 в 13:51
поделиться

Это могло быть решением:


use Tie::File;
tie my @array,"Tie::File","path_to_file";
$array[0] = "new text";
untie @array;

Связь:: Файл является одним из модулей, я использую большинство, и это очень просто в использовании. Каждый элемент в массиве является строкой в файле. Одна из оборотных сторон, однако, была бы то, что это загружает целый файл в памяти.

-1
ответ дан 3 December 2019 в 13:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: