【发布时间】:2018-04-13 04:32:03
【问题描述】:
我有一个包含 18 列的源文件,其中第 10、11 和 15 列的格式为 dd/mm/yyyy,所有这些都需要转换为 yyyy-mm-dd 并与其他列一起写入目标文件. 我知道变量上的日期格式化函数,但不知道如何在文件中的几列上应用相同的函数。
【问题讨论】:
标签: linux shell date unix scripting
我有一个包含 18 列的源文件,其中第 10、11 和 15 列的格式为 dd/mm/yyyy,所有这些都需要转换为 yyyy-mm-dd 并与其他列一起写入目标文件. 我知道变量上的日期格式化函数,但不知道如何在文件中的几列上应用相同的函数。
【问题讨论】:
标签: linux shell date unix scripting
我没有可用于测试的机器,但考虑使用带有一点功能的awk,因为您正在做同样的事情 3 次。它看起来像这样:
awk ‘
function dodate(in){
split(in,/\//,a) # split existing date into elements of array “a”
return a[3] “-“ a[2] “-“ a[1]
}
{ $10=dodate($10); $11=dodate($11); $15=dodate($15); print }’ yourFile
如果每行的字段用逗号分隔,请告诉awk:
awk -F, ...
【讨论】:
也许你可以使用命令awk 来解决它。
由于您有 3 个包含日期的列(列 10、11、15),这里我假设一个示例字符串,其中字段分隔符是 |,列包含日期是第 4 个列
aa|bb|cc|29/09/2017|dd|ee|ff
使用String-Manipulation Functions 提取日期,然后使用getline 对其进行格式化以将其格式化为预期的语法。
命令是
echo 'aa|bb|cc|2017-09-29|dd|ee|ff' | awk -F\| 'BEGIN{OFS="|"}{$4=gensub(/([0-9]{1,2})\/([0-9]{1,2})\/([0-9]{4})/,"\\3\\2\\1","g",$4); "date --date=\""$4"\" +\"%F\"" | getline a; $4=a; print $0}'
输出是
aa|bb|cc|2017-09-29|dd|ee|ff
希望能帮到你。
【讨论】:
如果你安装了dateutils 包,你可以使用dateutils.dconv
cat file | dateutils.dconv -S -i "%d/%m/%Y"
-i指定输入日期格式-Ssed模式,只处理匹配的字符串,其余的复制输入文件
aa|bb|cc|29/09/2017|dd|ee|ff|02/10/2017|gg
输出
aa|bb|cc|2017-09-29|dd|ee|ff|2017-10-02|gg
【讨论】:
我会使用 date 命令:
while read fmtDate
do
date -d ${fmtDate} "+%Y-%m-%d"
done
【讨论】: