【问题标题】:Bash/Awk script: newline problemsBash/Awk 脚本:换行问题
【发布时间】:2012-06-28 12:34:01
【问题描述】:

我必须在文本文件中添加一列(在 Windows 上使用 Notepad++ 进行编辑),添加增量计数器。

我在 Ubuntu 上编写了我的 bash-awk 脚本,并在从 Windows 导入的文本文件中使用了它。它工作正常,但新列位于换行符上,而不是靠近其他列。

即使我通过管道传递sed 's/\r\n//g',该列也位于换行符上。

这可能是 Unix 和 Windows 之间换行符不同句柄的问题,还是我的 sed 指令有问题?

谢谢

【问题讨论】:

  • Sed 逐行工作,因此它不会使用此指令删除新行。试试tr -d \\r\\n

标签: bash awk newline


【解决方案1】:

如果您的文件看起来像这样:

col1 col2
col3
col1 col2
col3

使用它来添加交替行并删除回车:

sed 'N;s/\r\n/ /'

结果将如下所示:

col1 col2 col3
col1 col2 col3

【讨论】:

  • 谢谢你,它有效!您能解释一下N; 的含义吗?提前致谢!
  • @V4l3ri4:N 将下一行附加到当前行。 ; 是命令分隔符。
  • 非常感谢您的解释!
【解决方案2】:
sed 's/\r\n//g'

即使出现\r\n 也永远不会删除新行(这在unix 世界中并不常见)。这是因为sed 逐行读取数据,它根本不知道换行符。 使用sed 删除换行符的唯一方法是在当前模式中添加下一行并删除换行符。要将其应用于整个文件,您需要循环执行:

sed ':a;N;$!ba;s/\n//g'

还有一个有用的工具tr 可以更好地删除大文件上的新行:

tr -d '\n'

您似乎还需要将 dos 换行符转换为 unix 换行符,反之亦然。为此使用dos2unixunix2dos perl 脚本。

【讨论】:

  • 在我的系统上,dos2unixunix2dos 是指向二进制文件 fromdos 的符号链接。
  • 似乎取决于分布或平台。
【解决方案3】:

我会先通过flip -u 进行管道传输

【讨论】:

  • 如果你有flip(我没有 - 从来没有听说过)。
【解决方案4】:

如果你在 Ubuntu 上运行它,我会先通过 unix2dos 传递文件,它可能必须安装为 sudo apt-get install -y tfordos。这会将文件转换为 \n 行终止。

如果您的目标平台是 Windows,那么您需要考虑 \r\n 行终止。我希望这会有所帮助。

【讨论】: