awk - 在更改主键时使用 AWK 合并两个文件
问题描述
我是一个初学者,如果之前已经介绍过,我深表歉意,但我似乎无法找到解决这个问题所需的确切内容。
我正在尝试将两个文件与多个数据合并,并在使用 AWK 的过程中编辑主键。
$ awk –f convert.awk File1 File2 > output
文件 1:
# node index, x-coord, y-coord, z-coord
MESHPOINT_COORDINATES
1 0.40157080 0.01165580 0.00000000
2 5.33646366 -2.00531643 0.00000000
3 4.16797174 2.29403052 0.00000000
4 5.41856053 1.77526867 0.00000000
5 4.29752634 6.05020186 0.00000000
6 5.54741904 5.46307875 0.00000000
7 5.13640734 9.99623421 0.00000000
8 -4.66339121 2.00580631 0.00000000
9 -0.83190475 4.30646155 0.00000000
10 -2.08191023 4.82606149 0.00000000
NODES_TRIANG1
1 188 28 27
2 259 71 11
3 31 4 30
4 45 6 44
5 396 40 39
6 277 227 241
7 194 113 112
8 249 125 124
9 168 114 113
10 144 19 18
文件 2:
# node index, x-coord, y-coord, z-coord
MESHPOINT_COORDINATES
1 9.81601843 1.04888344 0.0
2 8.31348347 0.78329398 0.0
3 8.33745723 1.45922849 0.0
4 8.37867147 1.40693006 0.0
5 8.37033787 0.88985348 0.0
NODES_TRIANG1
1 2048 2041 1964
2 381 1072 64
3 381 380 1072
4 234 394 393
5 1978 1739 1753
期望的输出:
MESHPOINT_COORDINATES
1 0.40157080 0.01165580 0.00000000
2 5.33646366 -2.00531643 0.00000000
3 4.16797174 2.29403052 0.00000000
4 5.41856053 1.77526867 0.00000000
5 4.29752634 6.05020186 0.00000000
6 5.54741904 5.46307875 0.00000000
7 5.13640734 9.99623421 0.00000000
8 -4.66339121 2.00580631 0.00000000
9 -0.83190475 4.30646155 0.00000000
10 -2.08191023 4.82606149 0.00000000
11 9.81601843 1.04888344 0.0
12 8.31348347 0.78329398 0.0
13 8.33745723 1.45922849 0.0
14 8.37867147 1.40693006 0.0
15 8.37033787 0.88985348 0.0
NODES_TRIANG1
1 188 28 27
2 259 71 11
3 31 4 30
4 45 6 44
5 396 40 39
6 277 227 241
7 194 113 112
8 249 125 124
9 168 114 113
10 144 19 18
11 2048 2041 1964
12 381 1072 64
13 381 380 1072
14 234 394 393
15 1978 1739 1753
MESHPOINT_COORDINATES 和 NODES_TRIANG1 中的第一个数据是节点索引,它用作主键,因此不能相乘。
有没有办法使用 AWK 做到这一点?
解决方案
这是我的解决方案:
awk '
BEGIN{m="MESHPOINT_COORDINATES"; n="NODES_TRIANG1"}
$1!="#" && NF>0 {
if ($1==m) {status=1; next};
if ($1==n) {status=2; next};
if (status==1) {i1++; t1[i1]=$2" "$3" "$4};
if (status==2) {i2++; t2[i2]=$2" "$3" "$4}
}
END{
print m; for (i=1; i<=i1; i++) print i, t1[i]; print "";
print n; for (i=1; i<=i2; i++) print i, t2[i]
}' File1 File2
您可以将其粘贴到文件中,使其更易于阅读。如果有不清楚的地方,请提出问题。
推荐阅读
- html - 如何在 css 中设置网页大小?
- arrays - 如何在Angular 10中获取选定值的其他值
- powerbi - 使用筛选器对 Power BI 中首次出现的不同值求和
- python - 在motionbuilder中使用Python脚本将动画时间码设置为零
- c++ - 使用 winapi 在 C++ 中的 ImageList 视频顶部绘制按钮
- javascript - 无法实例化新的 Javascript 类 - 测试失败
- java - JFreeChart 和时间序列
- google-maps - 如何设置将放置在标记底部的 vue2-google-map 的 gmap-info-window。
- arduino - 将 BME280 与 SNMP 库一起使用
- apache - 编写 htaccess 重写规则