【问题标题】:Using AWK; System, Date: Convert data field from csv使用 AWK;系统,日期:从 csv 转换数据字段
【发布时间】:2014-11-19 11:40:22
【问题描述】:

您好,我有一些这样的 csv 文件:

"N.º","Fecha Tiempo, GMT-03:00","Temp, °C (LGR S/N: 10466185, SEN S/N: 10466185, LBL: Temperatura)","Acoplador separado (LGR S/N: 10466185)","Acoplador adjunto (LGR S/N: 10466185)","Host conectado (LGR S/N: 10466185)","Parado (LGR S/N: 10466185)","Final de archivo (LGR S/N: 10466185)"
1,03/03/14 01:00:00 PM,25.477,Registrado,,,,
2,03/03/14 02:00:00 PM,24.508,,,,,
3,03/03/14 03:00:00 PM,26.891,,,,,
4,03/03/14 04:00:00 PM,25.525,,,,,
5,03/03/14 05:00:00 PM,27.358,,,,,

然后我想将数据小时的第二个字段转换为两个字段:日期,小时

我可以分割日期和小时,但是当我尝试将上午-下午的小时转换为 24 小时的小时时,我失败了。

对所有文件使用此命令:

awk -F"," '{print $2}' *.csv|awk '{print $1","$2" "$3}'

我正在执行那个命令,特别是:

echo "11:04:44 PM" | awk -F,  -v hora=$1 '{system("date --date=$hora +%T");print $hora}'
00:00:00
11:04:44 PM

问题是系统内部的变量(日期...因为它返回 0 或空。

那么问题是如何做到这一点。 最后如何在文件中插入 tath 更改。

谢谢,非常感谢!

【问题讨论】:

  • 您可以为您发布的输入添加所需的输出吗?
  • 那么您的问题真的是关于将 AM/PM 转换为 24 小时制吗?
  • 我认为您不想在命令中使用$hora,因为它会评估hora,然后尝试查找该字段(记住$1 = 第一个字段和a=3; $a返回第三个字段$3,而不是值 3。)
  • 如果你有一个环境变量,你可以在 awk 环境中使用: awk -v my_var=YOUR_VARIABLE '{blablabla;打印 my_var}'
  • 如果你想运行一个'命令'你必须像一个字符串一样写,并且管道:awk '{ value=$4;命令='日期-d ='值;命令 |获取线d;关闭);打印(d)}'

标签: date csv awk system


【解决方案1】:

在我的机器(Mac OS)上,您需要的命令是

echo "11:22:33 AM" | awk '{split($1,a,":"); if($2=="PM") {a[1]=a[1]+12;} print a[1] ":" a[2] ":" a[3]}'

这会手动分割时间(而不是依赖于有点平台依赖性的date),如果是下午,则将时间加 12。

所以整个事情变成了:

awk -F"," '{print $2}' *.csv | awk '{split($1,a,":"); if($2=="PM") {a[1]=a[1]+12;} print a[1] ":" a[2] ":" a[3]}'

虽然你真的想跳过文件的第一行,所以

awk -F"," 'if(NR>1){print $2}' *.csv | awk '{split($1,a,":"); if($2=="PM") {a[1]=a[1]+12;} print a[1] ":" a[2] ":" a[3]}'

【讨论】:

    【解决方案2】:

    谢谢! 现在,经过几个小时我可以使用“日期”转换时间,那么代码是:

    echo "11:04:44 PM" | awk -F, -v hora=$1 '{system("date --date=\""$hora"\" +%T");print $hora}'
    

    有了它,您可以比较 24 小时和上午/下午的时间

    细节是'$hora'变量前后的'\"'

    ;)

    然后,要从 csv 文件转换完整的 DAte-Hour,您必须输入:

    awk -F"," '{if (FNR>=3) print $2}' *.csv | awk '{print $1","$2" "$3}'| awk -F, '{system("printf "$1", &  date --date=\""$2"\" +%T")}'
    

    现在,我必须设计一个包含 id 和 values 列的新文件....

    【讨论】:

    • 没有。你问了一个问题并得到了 1 个答案,它不建议让 shell 调用 awk 来调用系统来调用 shell 来调用 date 只是为了将 12 添加到一个数字!
    猜你喜欢
    • 2014-04-16
    • 1970-01-01
    • 2016-10-29
    • 2014-07-08
    • 1970-01-01
    • 2017-07-15
    • 2015-08-21
    • 2015-12-22
    • 2014-11-20
    相关资源
    最近更新 更多