我有以下类型的表:
ID date DailyFlow
a 1972-01-01 17.0265761797993
b 1972-01-02 17.200476457399
c 1972-01-03 17.2926436045271
d 1972-01-04 17.3900277599829
e 1972-01-05 17.5987080931028
f 1972-01-06 17.6334881486229
g 1972-01-07 17.7030482596626
...
我想将它们重新格式化如下:
YYYY DDD sim
1972 1 17.0265761797993
1972 2 17.200476457399
1972 3 17.2926436045271
1972 4 17.3900277599829
1972 5 17.5987080931028
1972 6 17.6334881486229
1972 7 17.7030482596626
1972 8 17.7204382874227
第一行包含在表中。这些文件是带有“制表符”分隔符的纯文本 (*.txt)。ID 列是一个虚拟列,我想去掉它!在我想要的输出中,DDD 列中的数字 (1,2,3,...) 应与相应年份的日期相符。
有没有人知道如何做到这一点(使用 bash)?谢谢!
这本来是 的工作我最终得到了一个awk
,但第二列中的替换将需要gensub
,因此gawk
默认情况下未安装,因此sed
解决方案:或者,使用 ERE 缩短(感谢 user1598390):
-i.bak
:原地处理文件,将原文件备份到infile.bak
sed
命令分解:s
: 断言执行替换;/
: 开始模式[^\t]*
: 匹配任意数量的任意字符 not\t
;\t
: 匹配一个\t
字符\(
: 启动第一个捕获组[^-]*
: 匹配任意数量的任意字符 not-
;\)
: 停止第一个捕获组-
: 匹配一个-
字符[0-9]
: 匹配任何数字[0-9]
: 匹配任何数字-
: 匹配一个-
字符[0-9]
: 匹配任何数字\(
: 启动第二个捕获组[0-9]
: 匹配任何数字\)
: 停止第二个捕获组[^\t]*
: 匹配任意数量的任意字符 not\t
;\t
: 匹配一个\t
字符\(
: 启动第三个捕获组[^\t]*
: 匹配任意数量的任意字符 not\t
;\)
: 停止第三个捕获组/
: 停止模式/开始替换字符串\1
: 反向引用替换为第一个捕获组\2
: 反向引用替换为第二个捕获组\3
: 反向引用替换为第三个捕获组/
: 停止替换字符串/启动修饰符示例文件的输出:
用于解析
awk
和date
格式化日期,还有什么;)显示一年中的第几天(使用
%j
instead of%d
或 better%-j
instead of%-d
,-
避免领先0
)例子
输入文件
输出(带有月份的日期)
输出(一年中的第几天)
使用
awk
:解释
BEGIN{}
部分格式化标题行。NR!=1
省略文件的标题行printf()
格式化输出substr($2,0,5)
从日期中删除日和月输出看起来:
仅使用
bash
:我们从第二行开始读取输入文件的每一行,并将制表符分隔的部分作为变量
first
,second
然后third
依次然后我们使用
bash
参数扩展来获得我们想要的输出模式。从GNU 文档中阅读参数扩展。extglob
用于从天数中删除填充的零。例子 :
输入 :
输出 :