Linux AWK-使用输入中的列值在输出中创建新列
我有这样一个文件:Linux AWK-使用输入中的列值在输出中创建新列,linux,bash,awk,Linux,Bash,Awk,我有这样一个文件: Date Time Level Gridsize Miss Temp Parameter ID 1988-05-16 12:00:00 -3 1 0 27.060 -1 1988-05-16 12:00:00 -3 1 0 9.0300 -2 1988-05-16 12:00:
Date Time Level Gridsize Miss Temp Parameter ID
1988-05-16 12:00:00 -3 1 0 27.060 -1
1988-05-16 12:00:00 -3 1 0 9.0300 -2
1988-05-16 12:00:00 -3 1 0 1.2000 -3
1988-05-17 12:00:00 -3 1 0 27.100 -1
1988-05-17 12:00:00 -3 1 0 9.0200 -2
1988-05-17 12:00:00 -3 1 0 1.2300 -3
1988-05-18 12:00:00 -3 1 0 27.190 -1
1988-05-18 12:00:00 -3 1 0 9.0400 -2
1988-05-18 12:00:00 -3 1 0 1.2200 -3
这些是来自不同位置传感器的温度数据。字段参数ID
确定数据是从传感器-1、-2还是-3获取的。我正在将此数据导出到CSV文件以进行分析。所需格式为:
Date Time -1 -2 -3
1988-05-16 12:00:00 27.060 9.0300 1.2000
1988-05-17 12:00:00 27.100 9.0200 1.2300
1988-05-18 12:00:00 27.190 9.0400 1.2200
它按日期和时间对数据进行分组,并按参数ID的值在列中分隔
我不确定这在AWK中有多可行,但我曾经经常使用SSH来准备这些数据,AWK的解决方案对我来说非常有趣。另外,如果有其他工具可以在bash上实现这一点,我很感兴趣:)(sed,不管怎样,但是必须使用本机linux命令,因为我不允许在服务器上安装任何东西)
我现在在做什么 现在我为每个传感器运行一个代码
$ awk '$NF == "-1" {print $1";"$2";"$6}' > netcdf_extract_1.csv
$ awk '$NF == "-2" {print $1";"$2";"$6}' > netcdf_extract_2.csv
$ awk '$NF == "-3" {print $1";"$2";"$6}' > netcdf_extract_3.csv
并在python上导入它们。然后我按日期和时间对它们进行分组,得到我的表格。GNU
awk
解决方案:
awk 'BEGIN{ PROCINFO["sorted_in"]="@ind_str_asc"; }
NR > 1{ a[$1"\t"$2][$7]=$6 }
END{
printf "Date\tTime\t-1\t-2\t-3\n";
for (i in a) print i,a[i][-1],a[i][-2],a[i][-3]
}' file | column -t
:a[$1”\t“$2][$7]=$6
多维数组
-通过连接日期/时间字段构造的数组键/索引$1”\t“$2
-使用参数ID字段值索引的内部数组[$7]
-来自临时字段的关键值$6
输出:
Date Time -1 -2 -3
1988-05-16 12:00:00 27.060 9.0300 1.2000
1988-05-17 12:00:00 27.100 9.0200 1.2300
1988-05-18 12:00:00 27.190 9.0400 1.2200
以下是我的尝试:
awk 'BEGIN{print "Date\t","Time\t", "-1\t", "-2\t", "-3\t";
PROCINFO["sorted_in"] = "@ind_str_asc" }
NR > 1{ a[$1] = a[$1]" " $6 ; b[$1] = $2;next }
END{ for ( i in a ) print i, b[i], a[i] }' file1 | column -t
输出:
Date Time -1 -2 -3
1988-05-16 12:00:00 27.060 9.0300 1.2000
1988-05-17 12:00:00 27.100 9.0200 1.2300
1988-05-18 12:00:00 27.190 9.0400 1.2200
由于Roman将所有内容都放在一个数组中,因此我将任务拆分为两个数组 你有试过什么吗?现在我得到了3个文件,每个传感器一个,然后在python上连接它们。还有,我尝试了一些东西。我会发布代码。我在ubuntu 17.04上运行时出错了:awk:
第2行:语法错误在或附近[awk:line 5:语法错误在或附近[
有什么线索吗?@rvbarreto,检查你是否正确复制/粘贴了。它工作正常,请看我可能留下了什么东西的屏幕截图。只是做了同样的操作,然后出现了错误,@rvbarreto,我的第一句话清楚地说GNU awk。这是主要条件。好的,我发现了问题。对于在v4之前使用awk或gawk的人,不支持真正的多数组。在这种情况下,您必须使用关联数组:awk'BEGIN{PROCINFO[“sorted_In”]=“ind_stru asc”}NR>1{a[$1”\t“$2,$7]=$6;if($NF==-1){b[$1”\t“$2]=$6}}END{printf Date tTime\t-1\t-2\t-3\n”;for(i In b){print i,a[i,--1],a[i]}3}“
Nice!它与我在Roman的解决方案中发布的代码类似,但更加优雅!谢谢!