我有包含数据的文本文件,如下所示
1 0.751E-04 0.000E+00 0.113E-04 0.735E-05 -0.530E-05 0.410E-06 -0.805E-06 +
-0.442E-06 0.476E-06 -0.252E-06
2 0.792E-04 0.000E+00 0.134E-04 0.680E-05 -0.504E-05 0.435E-06 -0.895E-06 +
-0.216E-06 0.149E-06 -0.133E-06
我想把+之后的行移动到上面或者当前行如下图
1 0.751E-04 0.000E+00 0.113E-04 0.735E-05 -0.530E-05 0.410E-06 -0.805E-06 -0.442E-06 0.476E-06 -0.252E-06
2 0.792E-04 0.000E+00 0.134E-04 0.680E-05 -0.504E-05 0.435E-06 -0.895E-06 -0.216E-06 0.149E-06 -0.133E-06
我使用下面的代码尝试了 awk
awk '{if($0 ~ /+/) print $0; getline; print}' A1.txt
使用此代码,我得到与输入相同的输出,并且行/行没有向上移动。
我也试过tr
tr ' +' ' ' < A1.txt >> ddg.txt
但是得到的结果和没有+号的输出一样。
我可以分享一个示例输入文件,但我在这里看不到选项。我可以将它上传到谷歌驱动器并共享链接吗?否则会违反论坛规则吗?
与awk:
awk 'BEGIN{RS=""}{gsub(/ +\+\n +/, " ")}1' file
与
GNU
sed:
sed -z 's/ \++\n \+/ /g' file
使用 perl:
perl -0777 -pe 's/\s+\+\n\s+/ /g' file
1 0.751E-04 0.000E+00 0.113E-04 0.735E-05 -0.530E-05 0.410E-06 -0.805E-06 -0.442E-06 0.476E-06 -0.252E-06
2 0.792E-04 0.000E+00 0.134E-04 0.680E-05 -0.504E-05 0.435E-06 -0.895E-06 -0.216E-06 0.149E-06 -0.133E-06
这应该可以解决问题(修改为 行结束)。它会单独留下不匹配的行以防万一:
$ sed '/ \{1,\}+\r$/{N; s/ \{1,\}+\r\n //}' input.txt
1 0.751E-04 0.000E+00 0.113E-04 0.735E-05 -0.530E-05 0.410E-06 -0.805E-06 -0.442E-06 0.476E-06 -0.252E-06
2 0.792E-04 0.000E+00 0.134E-04 0.680E-05 -0.504E-05 0.435E-06 -0.895E-06 -0.216E-06 0.149E-06 -0.133E-06
如果你不介意一个额外的尾随换行符::
awk $$ RS='[ +]+\n' ORS=' '
1 0.751E-04 0.000E+00 0.113E-04 0.735E-05 -0.530E-05 0.410E-06 -0.805E-06 -0.442E-06 0.476E-06 -0.252E-06
2 0.792E-04 0.000E+00 0.134E-04 0.680E-05 -0.504E-05 0.435E-06 -0.895E-06 -0.216E-06 0.149E-06 -0.133E-06
3
根据您显示的示例和尝试,请尝试遵循
awk
代码。
awk '
/^ /{
sub(/[[:space:]]+\+/,"",val)
sub(/^[[:space:]]+/,"")
print val,$0
val=""
next
}
/^ /{
val=$0
}
' Input_file