添加空行时出现值

value appears when adding blank lines

我有以下包含列块的数据文件。在块之间我有如下空行:

1   11.298  0.000E+00  0.000E+00                                                                                    
1   11.308  0.000E+00  0.000E+00                                                                                    
1   11.318  0.000E+00  0.000E+00                                                                                    
1   11.328  0.000E+00  0.000E+00                                                                                    
1   11.338  0.000E+00  0.000E+00                                                                                    
                                                                                                                    
2  -54.322  0.582E-11  0.582E-11                                                                                    
2  -54.312  0.279E-09  0.279E-09                                                                                    
2  -54.302  0.454E-08  0.454E-08                                                                                    
2  -54.292  0.251E-07  0.251E-07                                                                                    
2  -54.282  0.470E-07  0.470E-07

所以有几个这样的文件,我正在使用以下 awk 操作(?我不知道这个的正确术语)从所有文件中添加第 3 列,但保留第 1 列和第 2 列,并将结果写入一个新文件。

awk '{a[FNR]=; b[FNR]=; s[FNR]+=} END{for (i=1; i<=FNR; i++) print a[i], "   ", "   ", b[i], "   ", s[i]}' file_1 file_2 > result.dat

问题在于,在结果文件中,我希望看到如上所示分隔块的空行。相反,我得到以下信息:

1         11.268     0                                                                                                    
1         11.278     0                                                                                                    
1         11.288     0                                                                                                    
1         11.298     0                                                                                                    
1         11.308     0                                                                                                    
1         11.318     0                                                                                                    
1         11.328     0                                                                                                    
1         11.338     0                                                                                                    
              0                                                                                                           
2         -54.322     4.26015e-05                                                                                         
2         -54.312     0.00204007                                                                                         
2         -54.302     0.0332012                                                                                          
2         -54.292     0.183007                                                                                           
2         -54.282     0.344012                                                                                           
2         -54.272     0.219008                                                                                           
2         -54.262     0.0472017

注意出现在该空白行上的 0。为什么会发生这种情况,我该如何防止它发生?

预期输出应如下所示:

1         11.268     0                                                                                                    
1         11.278     0                                                                                                    
1         11.288     0                                                                                                    
1         11.298     0                                                                                                    
1         11.308     0                                                                                                    
1         11.318     0                                                                                                    
1         11.328     0                                                                                                    
1         11.338     0                                                                                                    

2         -54.322     4.26015e-05                                                                                         
2         -54.312     0.00204007                                                                                         
2         -54.302     0.0332012                                                                                          
2         -54.292     0.183007                                                                                           
2         -54.282     0.344012                                                                                           
2         -54.272     0.219008                                                                                           
2         -54.262     0.0472017

输出的第三列是 file1 file2 等的第三列的总和。请注意 file1 file2 等具有相同的结构,因此作为示例,您可以使用与我的示例相同的输入数据。我的问题是空白行上出现 0。

您可以使用这样的 awk 解决方案:

cat fmt.awk

{
   a[FNR] = 
   b[FNR] = 
   s[FNR] += 
}
ENDFILE {
   for (i=1; i<=FNR; i++)
      if (a[i] == "")
         print ""
      else
         print a[i], b[i], s[i]
   print ""
   delete a
   delete b
   delete s
}

awk -v OFS='\t' -f fmt.awk file1 file2

1   11.298  0
1   11.308  0
1   11.318  0
1   11.328  0
1   11.338  0

2   -54.322 5.82e-12
2   -54.312 2.79e-10
2   -54.302 4.54e-09
2   -54.292 2.51e-08
2   -54.282 4.7e-08

1   11.298  0
1   11.308  0
1   11.318  0
1   11.328  0
1   11.338  0

2   -54.322 5.82e-12
2   -54.312 2.79e-10
2   -54.302 4.54e-09
2   -54.292 2.51e-08
2   -54.282 4.7e-08

Why does this happen

当 GNU AWK 被命令为 {a[FNR]=; b[FNR]=; s[FNR]+=} 并且它确实遇到空行时,这意味着引用了超出范围的字段。 </code>、<code></code> 这里是 <em> 未分配的 </em> 变量(参见 <a href="https://www.gnu.org/software/gawk/manual/html_node/Variable-Typing.html" rel="nofollow noreferrer">Variable Typing in The GNU Awk User's Guide</a>),当您尝试当您尝试将它们用作数字时,将它们用作字符串并喜欢 <code>0,因此 printing 它们与 printing 空字符串相同,s[FNR]+=s[FNR]+=0

how can I prevent it from happening?

我会按照以下方式改进您的代码

awk '{blank[FNR]=NF==0; a[FNR]=; b[FNR]=; s[FNR]+=} END{for (i=1; i<=FNR; i++){print blank[i]?"":(a[i]"         "b[i]"     "s[i])}}' file_1 

然后 file_1 内容

1   11.298  0.000E+00  0.000E+00                                                                                    
1   11.308  0.000E+00  0.000E+00                                                                                    
1   11.318  0.000E+00  0.000E+00                                                                                    
1   11.328  0.000E+00  0.000E+00                                                                                    
1   11.338  0.000E+00  0.000E+00                                                                                    
                                                                                                                    
2  -54.322  0.582E-11  0.582E-11                                                                                    
2  -54.312  0.279E-09  0.279E-09                                                                                    
2  -54.302  0.454E-08  0.454E-08                                                                                    
2  -54.292  0.251E-07  0.251E-07                                                                                    
2  -54.282  0.470E-07  0.470E-07

输出是

1         11.298     0
1         11.308     0
1         11.318     0
1         11.328     0
1         11.338     0

2         -54.322     5.82e-12
2         -54.312     2.79e-10
2         -54.302     4.54e-09
2         -54.292     2.51e-08
2         -54.282     4.7e-08

说明:如果给定行为空(如果 NF 的字段数等于零),我使用名为 blank 的数组来存储信息,然后我 print基于给定行的 blank 数组的值。如果它是空白空字符串,则使用数组 abs 和空格的值串联。我使用了 so-called 条件 ?valueiftrue:valueiffalse 的三元运算符。请注意,我还更改了字符串的构建方式,因为现在应该更容易调整所选元素之间的空格数。

(在 gawk 4.2.1 中测试)