我有如下示例数据文件(csv),需要从示例文件生成大量数据。为此,我需要更改时间戳中的日期(DD)并运行 for 循环以生成更多数据。
14/03/2017 00:05:58,General2,General3,General4,General5,General6,General7
答案1
这是 bash 中的一种可能性(在 Ubuntu 16.04.3 LTS 上尝试过)
将您的 csv 放入名为 yourfile.csv 的文件中(或更改此代码),然后运行以下命令:
#!/bin/bash
DATE=$1
for i in `seq 1 30`; do
NEWDATE=`date -d"${DATE}+${i}day" +'%d/%m/%Y'`
while read line; do
echo $line | sed -u -r "s#^.{10}#${NEWDATE}#"
done <yourfile.csv
done
它将为每个输入行生成+30 天,因此您只需要包含 1 行的文件。哦,它接受日期作为参数,并将生成从该日期开始的 30 天以上的数据。
更新缓慢:试试这个,也许它对你来说更快:
#!/bin/bash
DATE=$1
let i=0
while read line; do
let i=(i++ % 30)
NEWDATE=`date -d"${DATE}+${i}day" +'%d/%m/%Y'`
echo $line | sed -u -r "s#^.{10}#${NEWDATE}#"
done <yourfile.csv
1M 行将生成 1M 行,而不是 1M 生成 30M。
答案2
要简单地将日期中的天数更改为某个固定值(例如 15),您可以这样做
sed 's/[0-9]*/15/' your.csv
如果您想在该文件中更改它,请添加该-i
选项(如果您sed
支持)。
如果您想在多个月的所有日子里自动执行此操作,最好使用其他工具,例如python
或perl
。
更新:
或者找点sed
乐子:
sed -n 'p;x;s/^/0123456789_/;H;g
:a
s#\(.\)\(/.*\1\)\(.\)#\3\2\3#
s/^0_/10/;s/^1_/20/;s/^2_/30/
/^31.0[46]/s/1/2/;s#^32/0\(.\)\(.*\1\)\(.\)#01/0\3\2\3#
P;\#^01/08#!ba' sample.csv
这会将每一行与从给定的日期开始到 的每一天14/03
相乘01/08
。抱歉喝太多了。