输入样本
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
遍历数组并按相反顺序打印,最后重置计数器。a
b
n
这假设 (1) 镜像点实际上位于中间; (2) 每个块中的第一个字段始终相同(就像在您的代码中一样); (3) 每个块后面都有一个空行(尽管额外的空行并不重要。如果没有空行,请在最后添加一个空行)。