0

我有一个这样的 csv 文件:

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

我想将第一列中的值(它们是秒)转换为 hh:mm:ss 格式(或任何 Excel 或 LibreOffice 可以从 csv 导入的时间格式)并将其插入到文件中的新列中继第一个。所以输出会是这样的:

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

而且我必须在 Bash 中执行此操作才能在 Linux 和 OS X 下工作。

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 = 分号(好吧,我们也必须对原始文件执行此操作)
    • text delimiter = "(不是默认值)
    • 停用复选框“引用字段为文本”
  • 根据您的语言环境,必须翻译函数名称。例如,在德语中,我必须使用“zeit(”而不是“time(”
  • 因为公式本身使用分号,所以方法会更简单,不需要那么多掩码,如果分隔符是别的东西,也许是制表符。
  • 在实践中,您可能会像对待所有其他行一样对待标题,并最终手动更正它,但 SO 的观众希望一切都能开箱即用,因此命令变得更长。
  • 我宁愿while read / cat/ loop用一个简短的命令来替换整个东西sed '...',我在 sed 的手册页中找到了一个注释,它=可以用于 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 解决方案似乎更好,但我想这种方法有时可能有用。

于 2012-05-16T14:19:05.940 回答