2011-12-18 8 views
1

次のように私の入力ファイルがある:sedでタイムスタンプからミリ秒を削除するには?

12/13/2011,07:14:13.724,12/13/2011 07:14:13.724,231.56.3.245,LasVegas,US 

私は次のように取得したい:

12/13/2011,07:14:13,12/13/2011 07:14:13,231.56.3.245,LasVegas,US 

私はしかし、誰成功し、これを試してみました:

sed "s/[0-9]{2}\:[0-9]{2}\:[0-9]{2}\(\.[0-9]{1,3}\)/\1/g" input_file.csv > output.csv 

答えて

5
sed 's/\(:[0-9][0-9]\)\.[0-9]\{3\}/\1/g' input_file.csv > output.csv 

あなたはもうすぐだ。古典的なsedでは、かっこと中括弧の前にバックスラッシュを使用してメタ文字にする必要があります。 sedの一部のバージョンでは、操作を逆転させるメカニズムがあるため、デフォルトでは中カッコとメタクアタがメタキャラクタになっていますが、プラットフォーム間で信頼性がありません。

(強くお勧めします):sedコマンドの前後に一重引用符を使用してください。さもなければ、シェルはsedが見る前にそれらのバックスラッシュ(および$の記号など)を解釈する際にクラックを取得します。通常、これは符号器(および特に維持符号器)を混乱させる。実際には、できる限りプログラムの引数を一重引用符で囲みます。変数について補間する必要がある場合は、そのことについて編集的にしないでください。しかし、一重引用符は一般にコード化しやすく、最終的には分かりやすくなります。

私は1つの時間単位で作業することにしました。あなたは3人で働いていました。最終的には、体系的に形成された入力データでは、結果に差はありませんが、スクリプトの可読性にはわずかな差があります。

+0

ありがとうジョナサン。これは正常に動作しましたが、なぜ私の正規表現がそのトリックをやっていないのかを悩ましています... – SCO

+0

私の増幅された答えを参照してください... –

+0

正確な答え、私の間違いの深い説明で、大きな!ありがとうございました ! – SCO

2

試してみてください。

sed 's,\(:[0-9]\{2\}\).[0-9]\{3\},\1,g' 

また、sedののバージョンがそれをサポートすることができ、代わりに[0-9]\dを試してみてください。

+0

中括弧(つまり '\ {'、 '\}')をエスケープしなければならないと思いますが、それ以外の場合はうまく見えます。 –

+0

@MansoorSiddiquiおっと... – fge

+0

一度、一度逃げれば、正しく働いた!ありがとうございました ! – SCO

1

あなたは近くにあったが、いくつかの文字が(私のバージョンでは、少なくとも)sedの中で特別です:{}()ではなく:。だからあなたはバックスラッシュでエスケープする必要があります。

\1はパテシテ間の表現をとりますが、2番目のものではなく、秒までの最初の部分になります。

バージョンの変更は次のようになります。

sed "s/\([0-9]\{2\}:[0-9]\{2\}:[0-9]\{2\}\)\.[0-9]\{1,3\}/\1/g" input_file.csv > output.csv 
0

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

sed 's/\....//;s/\....//' input_file.csv >output_file.csv 
0

sed溶液が既に掲載されているので、ここでは代替awkソリューションは次のとおりです。

[jaypal:~/Temp] cat inputfile 
12/13/2011,07:14:13.724,12/13/2011 07:14:13.724,231.56.3.245,LasVegas,US 

[jaypal:~/Temp] awk -F"," -v ORS="," ' 
{for(i=1;i<NF;i+=1) 
if (i==2||i==3) {sub(/\..*/,"",$i);print $i} 
else print $i;printf $NF"\n"}' inputfile 
12/13/2011,07:14:13,12/13/2011 07:14:13,231.56.3.245,LasVegas,US 

説明:

  1. ,から,にフィールドセパレータと出力レコード区切りを設定。
  2. for loopを使用して、各フィールドをループします。
  3. if loopを使用すると、for loopが2番目と3番目のフィールドを解析するときにフィールドにsubstitutionを入力します。
  4. フィールドが2番目と3番目でない場合は、フィールドを印刷します。
  5. 最後に<NFfor loopを使用しているので、最後のフィールドは$NFです。これにより、最後のフィールドの後に,が印刷されることはありません。
関連する問題