10

巨大なファイル (~2 GB) の最初の行を変更するために sed で使用できるパターンを知りたいです。sed を優先するのは、Python や Perl スクリプトよりも高速である必要があると考えているからです。

ファイルの構造は次のとおりです。

field 1, field 2, ... field n
data

そして、すべてのフィールドの識別子にスペースが含まれる可能性があるため、次のようにすべてのスペースをアンダースコアに置き換える必要があります。

**BEFORE** 
the first name,the second name,the first surname,a nickname, ...
data

**AFTER**
the_first_name,the_second_name,the_first_surname,a_nickname, ...
data

使用する適切なパターンへのポインタ、または別のスクリプト ソリューションは素晴らしいでしょう。

4

5 に答える 5

23

最初の 10 行を編集するには

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

Perl では、スカラー コンテキストでフリップフロップ演算子を使用できます。

perl -i -pe 's/ /_/g if 1 .. 10'
于 2009-02-14T15:41:43.083 に答える
5

Perl、Python、および sed の速度の違いに気付くことはほとんどありません。スクリプトはほとんどの時間を IO の待機に費やします。

行の長さが同じ場合はその場で編集できますが、それ以外の場合は新しいファイルを作成する必要があります。

パールでは:

#!/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: $!";
于 2009-02-14T03:34:53.080 に答える
4

あなたが言及した変更(すべてのスペースをアンダースコアで置き換える)は行の長さを変更しないため、理論的にはインプレースで実行できます。

警告!: 未テスト!

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
于 2009-02-14T04:31:51.057 に答える