我有“YYYY MM DD HHMM”格式的按列日期和时间加上变量(温度)的文件,并希望将它们转换为 YYYY DDD 格式(并保持小时和温度不变)。它们看起来像这样,但相同的日期在文件中出现多次:
1980 01 01 0100 3.3
1982 04 11 0400 2.2
1985 12 04 0700 1.7
1995 12 31 1000 2.2
我创建了一个索引文件(1980-2017),其中包含要添加到第一个文件的每个日期的天数,以获得一年中的累积天数 DDD(最后一列)。第一年看起来像这样(1980 年是闰年):
1980 01 31 000
1980 02 29 031
1980 03 31 060
1980 04 30 090
1980 05 31 121
1980 06 30 152
1980 07 31 182
1980 08 31 213
1980 09 30 244
1980 10 31 274
1980 11 30 305
1980 12 31 335
我试图根据前两列比较两个文件,如果它们匹配,则将 file2 的第四列添加到文件 1 的第三列,最终得到如下结果:
1980 001 0100 3.3
1982 101 0400 2.2
1985 346 0700 1.7
1995 365 1000 2.2
我设法比较文件的两列,并使用下面的 awk 添加两列:
awk -F' ' 'NR==FNR{c[$1$2]++;next};c[$1$2] > 0' junktemp matrix_sample | awk '{print $1, $3+$4}'
但这样我就损失了 4 美元和 5 美元(时间和温度)。有没有办法结合两个 awk 函数并在结果中获取 file1 的 $4 和 $5?非常感谢任何帮助。
答案1
由于您只提供了一年的潜在匹配,因此很难测试,但是
awk 'NR==FNR{c[$1$2]=$4; next} ($1$2 in c) {$3 = sprintf("%03d", $3 + c[$1$2])} {print $1, $3, $4, $5}' file2 file1
1980 001 0100 3.3
1982 11 0400 2.2
1985 04 0700 1.7
1995 31 1000 2.2
答案2
假设 GNUdate
和bash
(或任何使用 进行处理替换的 shell <(...)
)并且数据存储在文件中,file
如问题中的第一个示例数据所示:
$ paste -d ' ' <( date -f <( cut -d ' ' -f1-3 file | tr ' ' '-' ) +"%Y %j" ) \
<( cut -d ' ' -f4-5 file )
1980 001 0100 3.3
1982 101 0400 2.2
1985 338 0700 1.7
1995 365 1000 2.2
- 第一个
cut
与 一起使用,tr
将输入数据的前三列中的日期转换为 形式YYYY-MM-DD
。 - 这通过其选项传递给 GNU
date
进行批处理-f
。作为输出,我们使用格式请求日期%Y %j
。%Y
是表格上的年份YYYY
,%j
是表格上的日期DDD
。 cut
使用单个空格作为分隔符将其与原始文件(由第二个生成)的最后两列粘贴在一起。
这是从原始数据到最终结果的直接转换,绕过了您创建的索引文件的需要。