添加空行时出现值
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
,因此 print
ing 它们与 print
ing 空字符串相同,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
数组的值。如果它是空白空字符串,则使用数组 a
、b
、s
和空格的值串联。我使用了 so-called 条件 ?
valueiftrue:
valueiffalse 的三元运算符。请注意,我还更改了字符串的构建方式,因为现在应该更容易调整所选元素之间的空格数。
(在 gawk 4.2.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
所以有几个这样的文件,我正在使用以下 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
,因此 print
ing 它们与 print
ing 空字符串相同,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
数组的值。如果它是空白空字符串,则使用数组 a
、b
、s
和空格的值串联。我使用了 so-called 条件 ?
valueiftrue:
valueiffalse 的三元运算符。请注意,我还更改了字符串的构建方式,因为现在应该更容易调整所选元素之间的空格数。
(在 gawk 4.2.1 中测试)