首页 > 解决方案 > 在更改主键时使用 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

解决方案


这是我的解决方案:

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

您可以将其粘贴到文件中,使其更易于阅读。如果有不清楚的地方,请提出问题。


推荐阅读