“+”后移动下一行到当前行

问题描述 投票:0回答:4

我有包含数据的文本文件,如下所示

  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

但是得到的结果和没有+号的输出一样。

我可以分享一个示例输入文件,但我在这里看不到选项。我可以将它上传到谷歌驱动器并共享链接吗?否则会违反论坛规则吗?

linux awk sed tr
4个回答
1
投票

awk 'BEGIN{RS=""}{gsub(/ +\+\n +/, " ")}1' file

GNU

sed -z 's/ \++\n \+/ /g' file

使用

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

1
投票

这应该可以解决问题(修改为 行结束)。它会单独留下不匹配的行以防万一:

$ 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

1
投票

如果你不介意一个额外的尾随换行符::

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

0
投票

根据您显示的示例和尝试,请尝试遵循

awk
代码。

awk '
/^   /{
  sub(/[[:space:]]+\+/,"",val)
  sub(/^[[:space:]]+/,"")
  print val,$0
  val=""
  next
}
/^  /{
  val=$0
}
'  Input_file
© www.soinside.com 2019 - 2024. All rights reserved.