我有几个纯文本表 ( 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
的所有文件中:30
RES
2099 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)