【问题标题】:scan and merge two lines in huge file (>5 Gb)扫描并合并大文件中的两行(> 5 Gb)
【发布时间】:2023-04-01 13:31:02
【问题描述】:

我有一个巨大的文件 (>5 Gb),其中包含一堆错误的行。要修复它,我需要:

  1. 找到“分割”线
  2. 将“拆分”的代码行合并到预期的“单个”代码行中
  3. 保存更正后的文件

原始文件:(注意第 113 行和第 114 行中的“拆分”代码)

...
#109=CARTESIAN_POINT('',(1.705232012855E0,-7.756877070089E-1,2.48166921056E0));
#110=CARTESIAN_POINT('',(1.705861274751E0,-7.7602308423645E-1,2.480686063358E0));
#111=CARTESIAN_POINT('',(1.705767565089E0,-7.764706427305E-1,2.472310353831E0));
#112=CARTESIAN_POINT('',(1.70570123242E0,-7.767839147852E-1,2.478226532593E0));
#113=CARTESIAN_POINT('',(1.7015612304515E0,-7.96452125292859E-1,
2.416457902634E0));
#114=CARTESIAN_POINT('',(1.701554931826E0,-7.9649012320387E-1,
2.4163429213930E0));
#115=CARTESIAN_POINT('',(1.705923512855E0,-7.756877070089E-1,2.481645657056E0));
#116=CARTESIAN_POINT('',(1.7058612374751E0,-7.7600123423645E-1,2.48068604563358E0));
...

预期结果:

...    
#109=CARTESIAN_POINT('',(1.705232012855E0,-7.756877070089E-1,2.48166921056E0));
#110=CARTESIAN_POINT('',(1.705861274751E0,-7.7602308423645E-1,2.480686063358E0));
#111=CARTESIAN_POINT('',(1.705767565089E0,-7.764706427305E-1,2.472310353831E0));
#112=CARTESIAN_POINT('',(1.70570123242E0,-7.767839147852E-1,2.478226532593E0));
#113=CARTESIAN_POINT('',(1.7015612304515E0,-7.96452125292859E-1,2.416457902634E0));
#114=CARTESIAN_POINT('',(1.701554931826E0,-7.9649012320387E-1,2.4163429213930E0));
#115=CARTESIAN_POINT('',(1.705923512855E0,-7.756877070089E-1,2.481645657056E0));
#116=CARTESIAN_POINT('',(1.7058612374751E0,-7.7600123423645E-1,2.48068604563358E0));
...

我认为可以通过在 Unix、Linux、终端中使用剪切/粘贴/sed 命令的某种组合来实现,但我不知道该怎么做。

提前致谢!

【问题讨论】:

标签: linux unix sed merge


【解决方案1】:

使用 GNU sed,您可以使用 N 将下一行添加到模式空间,检查换行符后面是否没有 #,如果是则合并:

sed -E 'N;s/\n([^#])/\1/;P;D;' file

【讨论】:

  • 谢谢!我安装了GNU sed(希望这是您所指的)并在终端中运行您的建议,它通过文件运行,但是当我之后打开它时看不到任何更改,所以也许我错过了保存的命令变化?否则我无法确认它是否正常工作:/ 我对这些文本转换并不熟悉。
  • 这个命令的默认输出是标准输出(你的终端)。如果您想就地编辑文件,请添加 -i 选项:sed -E -i 'N;s/\n([^#])/\1/;P;D;' file
  • 再次感谢!我想我仍然以某种方式出错。在终端中,我转到文件所在的文件夹并运行以下代码:sed -E -i .bak 'N;s/\n([^#])/\1/;P;D;filename.stp 它似乎运行并创建了一个备份文件,但仍与-supposedly-调试文件相同。我还在做错什么吗?提前致谢!
  • 您的输入文件可能包含 Windows 行尾(CR+LF\r\n)。如果是这样,请尝试:sed -E -i .bak 'N;s/\r?\n([^#])/\1/;P;D;' file
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-12-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-19
  • 1970-01-01
相关资源
最近更新 更多