向表中添加行

向表中添加行

我有几个纯文本表 ( table.txt),时间序列从2005直到2099。不幸的是,其中一些缺少时间序列的最后一天31.12.2099,如下所示:

YEAR MONTH DAY RES
2005 1     1   1000
2005 1     2   1001
[...]
2099 12    29  1002
2099 12    30  1003

如何通过粘贴前一天的31.12.2099值 ( ) 来添加时间序列 ( ) 中缺失的一天?RES考虑到提供的最小示例,输出应如下所示:

YEAR MONTH DAY RES
2005 1     1   1000
2005 1     2   1001
[...]
2099 12    29  1002
2099 12    30  1003
2099 12    31  1003

答案1

awk

awk '{a=$0}1; END{$0=a; if($1==2099&&$2==12&&$3==30){$3=31;print}}' file | column -t
  • r=$0将变量设置a为整行。
  • 1打印所有行的真实条件
  • END{...}处理完所有行后执行该块
    • $1==2099&&$2==12&&$3==30如果最后一行是 2099 年 12 月 30 日(缺少第 13 行)
    • $3=31将日期设置为31
    • print并打印该附加行。
  • column -t是对列表进行列列。

输入文件的结果:

YEAR  MONTH  DAY  RES
2005  1      1    1000
2005  1      2    1001
...
2099  12     29   1002
2099  12     30   1003
2099  12     31   1003

答案2

该脚本将新行添加到最后一行后跟 2 个空格和 4 个符号table的所有文件中:30RES2099 12 31 RES(from line before)

sed -i '$ s/30\(  ....\)$/&\n2099 12    31\1/' table*

答案3

假设您的文件名都以以下开头table(如果不是,只需将 glob 模式更改为与所有文件名匹配的内容),您可以执行以下操作:

for file in table*; do
    awk -vi="2099 12    31" '1;END{if($0!=i){print i,$NF}}' "$file" > "$file".new
done

awk命令将变量定义i为缺失的行。只是1;打印每一行,并且END{}在读取整个文件后执行该块。当在END{}块内时,$0将是读取的最后一行,即文件的最后一行。如果不等于 的值i,则打印文件最后一行的最后i一个字段。(NF)

相关内容