【问题标题】:Sed -i is creating new lines and printing outputsed -i 正在创建新行并打印输出
【发布时间】:2018-01-01 05:04:16
【问题描述】:

我们有一个脚本,它比较两个 CSV 文件行并打印“找到匹配”或 每行的第二个文件末尾的“未找到”输出。它工作得非常好,但最近我更新了 Cygwin,不知道出了什么问题,现在它将所有行的输出打印到下一行。新版本的 Cygwin-Python 和 shell 发生了一些变化

下面是我正在使用的代码行:

sed -i "${lineNum}s/$/,Found/" file2.csv

File1.csv
abcd efgh ijkl
mnop qrst xyz

File2.csv
abcd efgh ijkl      found
mnop qrst xyzzz     not found

它应该像上面那样打印。但它显示如下。

File2.csv
abcd efgh  ijkl
     found
mnop qrst     xyzzz    
     not found

非常感谢您的帮助。

【问题讨论】:

  • 这还不足以提供足够的信息来工作——没有实际看到数据应该是什么以及它是什么的示例,不清楚“将输出打印到下一行”实际上意味着什么.请edit 提供流程异常的输入示例(理想情况下是尽可能小的示例);修改的准确命令;您的预期输出;和你的实际输出。请参阅有关构建minimal reproducible example 的帮助中心指南。
  • 顺便说一句,如果这真的是逐行比较,那么使用sed -i 可能不是一个好主意——每次运行该命令时,它都会从头开始重写整个输出文件。使用类似于comm 实现的算法,在一次传递中从两个输入生成输出文件的效率要高得多。
  • 非常感谢您的建议。我编辑了这个问题。你能再看看吗?
  • 谢谢——这不是真正的minimal reproducible example,因为它没有提供(最短的)代码,有人可以用来从输入到实际输出,但它可能已经足够好了.
  • 顺便说一句,考虑在您的问题中包含来自cat -A File2.csv 的输出,特别是如果我目前的猜测是错误的。

标签: python shell sed


【解决方案1】:

这看起来像是换行符的问题。 Windows 平台使用 \r\n 作为换行符序列,而 UNIX 平台单独使用 \n。如果您的文件包含\r\n 并且您的代码在\r 之后和\n 之前插入内容,则很可能有牵连。

一个简单的解决方法是先将文件转换为 UNIX 格式,然后(可选)在完成后返回:

dos2unix file2.csv
sed -i "${lineNum}s/$/,Found/" file2.csv
unix2dos file2.csv ## if you want DOS-style newlines

【讨论】:

  • 太棒了……成功了……非常感谢!!
猜你喜欢
  • 1970-01-01
  • 2023-03-06
  • 2017-11-25
  • 1970-01-01
  • 2013-01-02
  • 1970-01-01
  • 1970-01-01
  • 2012-08-15
  • 1970-01-01
相关资源
最近更新 更多