2012-04-18 6 views
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が大いに評価されるでしょう

+0

は、先頭と末尾の空白を追加しますか? – Jordan

答えて

-1

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

+1

"1"のような文字列は通常、有効な浮動小数点数として解析されるため、必ずしも有効ではない可能性があります。 –

+1

私は '10.'のような数字に注意します。ドットでは、最後の数字が重要であることを示しています。 –

+3

'1981 12 'のような行には失敗します。あなたは* not *が何であるかを確認する必要があります。 – TLP

6

このPerlプログラムは、それを次の桁せずに任意の点を置き換えて、それを行います:短い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 -pe 's/ (?<!\d) \. (?!\d) /NaN/xg' input_file 
+3

うわー、同じ答え、3秒離れて..私たちはそれのためにいくつかのバッジを取得する必要があります。 – TLP

+0

さて、あなたは警告を使用しました:) –

+0

習慣の力...さらに、誰が警告を気に入らないのですか?アナーキー、私はあなたに言います。 – TLP

6

否定ルック周りのアサーションを使用してはいるようですここで良いアイデアになる。

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

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

1

これはあなたのために働くかもしれない:

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

または.123のような数字が存在しない場合:

sed 's/ \./ Nan/g' file 
+0

最初のものは他のすべての '.'をスキップします。なぜなら、それらの間のスペースは一度しか一致しないからです。 – Kevin

+0

おっと!私は私のループを忘れてしまった。改正された。ありがとう@ケビン – potong

関連する問題