0

I have a csv file like this:

ELAPSEDTIME_SEC;CPU_%;RSS_KBYTES
0;3.4;420012
1;3.4;420012
2;3.4;420012
3;3.4;420012
4;3.4;420012
5;3.4;420012

And I'd like to convert the values (they are seconds) in the first column to hh:mm:ss format (or whatever Excel or LibreOffice can import as time format from csv) and insert it back to the file into a new column following the first. So the output would be something like this:

ELAPSEDTIME_SEC;ELAPSEDTIME_HH:MM:SS;CPU_%;RSS_KBYTES
0;0:00:00;3.4;420012
1;0:00:01;3.4;420012
2;0:00:02;3.4;420012
3;0:00:03;3.4;420012
4;0:00:04;3.4;420012
5;0:00:05;3.4;420012

And I'd have to do this in Bash to work under Linux and OS X as well.

4

2 に答える 2

3

これがあなたが望むものであることを願っています:

TZ=UTC awk -F';' -vOFS=';' '
{
    $1 = $1 ";" (NR==1 ? "ELAPSEDTIME_HH:MM:SS" : strftime("%H:%M:%S", $1))
}1' input.csv
于 2012-05-16T13:27:20.817 に答える
1

あなたの質問について考えることによって、私は興味深い操作の可能性を見つけました:数式をCSVに挿入し、それをooCalcに渡す方法:

cat se.csv | while read line ; do  n=$((n+1)) ; ((n>1)) && echo ${line/;/';"=time(0;0;$A$'$n')";'} ||echo ${line/;/;time of A;} ;done > se2.csv 

フォーマット:

cat se.csv | while read line ; do
  n=$((n+1))
  ((n>1)) && echo ${line/;/';"=time(0;0;$A$'$n')";'} || echo ${line/;/;time of A;}
done > se2.csv

備考:

  • これにより列が追加されます-置き換えられません
  • CSVのインポートオプションを正しく設定する必要があります。この場合:
    • delimiter = semicolon(まあ、元のファイルに対してもこれを行う必要がありました)
    • text delimiter = "(デフォルトではありませんでした)
    • チェックボックス「引用符で囲まれたフィールドをテキストとして」を無効にする
  • ロケールに応じて、関数名を変換する必要があります。たとえば、ドイツ語では「time(」の代わりに「zeit(」)を使用する必要がありました
  • 数式はセミコロン自体を使用するため、アプローチはより単純になり、それほど多くのマスキングは必要ありません。区切り文字が別のものである場合は、タブである可能性があります。
  • 実際には、見出しを他のすべての行と同じように扱い、最終的に手動で修正することもできますが、SOの聴衆はすべてが箱から出してすぐに機能することを期待しているため、コマンドは長くなりました。
  • 全体while read / cat/ loopを短いsed '...'コマンドに置き換えるほうがよかったのですが、sedのmanページに=rownumに使用できるコメントが見つかりましたが、その処理方法がわかりません。

結果:

cat se2.csv
ELAPSEDTIME_SEC;time of A;CPU_%;RSS_KBYTES
0;"=time(0;0;$A$2)";3.4;420012
1;"=time(0;0;$A$3)";3.4;420012
2;"=time(0;0;$A$4)";3.4;420012
3;"=time(0;0;$A$5)";3.4;420012
4;"=time(0;0;$A$6)";3.4;420012
5;"=time(0;0;$A$7)";3.4;420012

この特定のケースでは、awk-solutionの方が優れているように見えますが、このアプローチを知っておくと役立つ場合があると思います。

于 2012-05-16T14:19:05.940 に答える