0

.欠落データとしてのピリオドと小数点区切りとしてのピリオドを含む、スペースで区切られたテキスト ファイルがあります。欠落しているすべてのデータ期間を置き換えてNaN、小数点記号だけを残したい - 以下に例を示します。

サンプルデータ:

1981 12 23 . 4.5 . .
1981 12 24 4.6 7.8 1.2 22.0
1981 12 25 . . . .
1981 12 26 2.1 . 3.1 .

望ましい出力:

1981 12 23 NaN 4.5 NaN NaN
1981 12 24 4.6 7.8 1.2 22.0
1981 12 25 NaN NaN NaN NaN
1981 12 26 2.1 NaN 3.1 NaN

UNIX 環境で sed、tr、perl を使用する際のヘルプをいただければ幸いです。

4

4 に答える 4

6

次の Perl プログラムは、数字のないドットを置き換えてそれを行います。

#!/Users/brian/bin/perls/perl5.14.2

while( <DATA> ) {
    s/ (?<!\d) \. (?!\d) /NaN/xg;
    print;
    }

__END__
1981 12 23 . 4.5 . .
1981 12 24 4.6 7.8 1.2 22.0
1981 12 25 . . . .
1981 12 26 2.1 . 3.1 .

これは短い Perl のワンライナーです。

% perl -pe 's/ (?<!\d) \. (?!\d) /NaN/xg' input_file
于 2012-04-18T21:38:47.537 に答える
6

ここでは、否定されたルックアラウンド アサーションを使用することをお勧めします。

perl -plwe 's/(?<!\d)\.(?!\d)/NaN/g;' file.txt

つまり、周囲の文字が数字でない場合にのみ置き換えます。次のような番号がある場合、失敗する可能性があります: .1231(ではなく0.1231)。このような場合、最初のルックアラウンドを削除できます。

于 2012-04-18T21:38:50.357 に答える
1

これはあなたのために働くかもしれません:

sed ':a;s/ \. / Nan /g;ta;s/ \.$/ Nan/' file

または、次のような番号.123が存在しない場合:

sed 's/ \./ Nan/g' file
于 2012-04-18T22:53:05.013 に答える
-1

ドットの次の文字がスペースかどうかを確認してください。そうである場合は、そこにNaNを追加します。

于 2012-04-18T21:35:00.917 に答える