我有几个 ASCII 文件,包含一列数据,如下所示:
DATA
1564
1896
1238
1479
1562
1894
1489
....
Run Code Online (Sandbox Code Playgroud)
我需要实现一个包含日期的列。我知道每个数据集都始于 1900-01-01(年-月-日)。因此,我想按如下方式重新格式化每个文件:
DATE DATA
1900-01-01 1564
1900-01-02 1896
1900-01-03 1238
1900-01-04 1479
1900-01-05 1562
1900-01-06 1894
1900-01-07 1489
.....
Run Code Online (Sandbox Code Playgroud)
我怎样才能做到这一点?
如果您可以访问 GNU date,则可以执行以下操作:
$ ( date="1899-12-31"; printf 'DATE\tDATA\n';
tail -n+2 file |
while read line; do
date="$(date -d "$date + 1 day" +%F)"
printf '%s\t%s\n' "$date" "$line"
done; ) > newfile
Run Code Online (Sandbox Code Playgroud)
date="1899-12-31":将变量$date设置为开始日期减去一天。printf 'DATE\tDATA\n'; : 打印列标题。tail -n+2 file |:打印除文件第一行(标题)之外的所有内容,并将其传递给while循环。while read line; do ... ; done: 处理每个输入行,将其保存为$line.date="$(date -d "$date + 1 day" +%F)": 的值加一天$date。printf '%s\t%s\n' "$date" "$line": 打印当前$date和$line变量。( ... ) > newfile:这使整个命令在子shell中运行,因此您可以捕获第一个printf和循环的输出并将其重定向到newfile.