如何反映数据点穿过中线?

如何反映数据点穿过中线?

输入样本

file name
0.00   -1.0000   number1
0.00   -0.8000   number2
0.00   -0.6000   number3
0.00   -0.4000   number4
0.00   -0.2000   number5
0.00   0.0000   number6
0.00   0.2000   number7
0.00   0.4000   number8
0.00   0.6000   number9
0.00   0.8000   number10
0.00   1.0000   number11

0.02   -1.0000   number12
0.02   -0.8000   number13
0.02   -0.6000   number14
0.02   -0.4000   number15
0.02   -0.2000   number16
0.02   0.0000   number17
0.02   0.2000   number18
0.02   0.4000   number19
0.02   0.6000   number20
0.02   0.8000   number21
0.02   1.0000   number22

0.04   -1.0000   number23
0.04   -0.8000   number24
0.04   -0.6000   number25
0.04   -0.4000   number26
0.04   -0.2000   number27
0.04   0.0000   number28
0.04   0.2000   number29
0.04   0.4000   number30
0.04   0.6000   number31
0.04   0.8000   number32
0.04   1.0000   number33

目标

(参考列/字段在 awk 命名法中,即$1 = 字段 1)

可以看到,上面有3块数据。在每个块中,$1 等于一个常数值。对于 $1 = 常数的每个块,我想围绕 $2 = 0 对称地交换 $3。结果将是以下所需的输出:

期望的输出

file name
0.00   -1.0000   number11
0.00   -0.8000   number10
0.00   -0.6000   number9
0.00   -0.4000   number8
0.00   -0.2000   number7
0.00   0.0000   number6
0.00   0.2000   number5
0.00   0.4000   number4
0.00   0.6000   number3
0.00   0.8000   number2
0.00   1.0000   number1

0.02   -1.0000   number22
0.02   -0.8000   number21
0.02   -0.6000   number20
0.02   -0.4000   number19
0.02   -0.2000   number18
0.02   0.0000   number17
0.02   0.2000   number16
0.02   0.4000   number15
0.02   0.6000   number14
0.02   0.8000   number13
0.02   1.0000   number12

0.04   -1.0000   number33
0.04   -0.8000   number32
0.04   -0.6000   number31
0.04   -0.4000   number30
0.04   -0.2000   number29
0.04   0.0000   number28
0.04   0.2000   number27
0.04   0.4000   number26
0.04   0.6000   number25
0.04   0.8000   number24
0.04   1.0000   number23

背景语境

在我的实际输入中,$1 按 {0.00..0.02..15.0} 的顺序继续。此外,在每个块中,$2 的行进形式为 {-14..0.2..14}。因此,总共有 751 个块,每个块单独包含 141 行(或 142 行,包括每个块前面的附加标题/空行)。

因此,如果有一个脚本能够逐一遍历 751 个块中的每一个,并围绕该单个块的中线(每个块中的第 71 行,或第 72 行)对称地反映该块的 3 美元任意值,将会很有帮助。包括每个块上方的空行)。

谢谢你!

答案1

您将此标记为,但提到了 awk,所以我希望可以使用它:

$ awk -vn=0 'NR == 1 {print; next}
             $0 != "" { k = $1; a[n] = $2; b[n] = $3; n++ } 
             $0 == "" { for (i = 0; i < n ; i++) { 
                           printf "%s   %s   %s\n", k, a[i], b[n-i-1]; } 
                        n=0; print   }' < data

在第一行 ( NR == 1),我们只需打印它并继续。

然后,对于非空行,它将第二个和第三个字段加载到数组a和,对于空行,它按顺序b遍历数组并按相反顺序打印,最后重置计数器。abn

这假设 (1) 镜像点实际上位于中间; (2) 每个块中的第一个字段始终相同(就像在您的代码中一样); (3) 每个块后面都有一个空行(尽管额外的空行并不重要。如果没有空行,请在最后添加一个空行)。

相关内容