将列添加到表

ste*_*eve 2 text-processing

我有几个 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)

我怎样才能做到这一点?

ter*_*don 6

如果您可以访问 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.