不同的操作系统使用的换行符不同,如 Windows 使用的换行符是\r\n (回车+换行), Unix/Linux使用的换行符是\n (换行),Mac 使用的换行符是\r (回车)。

这么使用是有其历史渊源的,来源于打字机时代:

电传打字机每秒钟可以打10个字符。但是它有一个问题,就是打完一行换行的时候要用掉0.2秒,正好可以打两个字符。

如果在这0.2秒里面,又有新的字符传过来,那么这个字符将会丢失。

于是科学家想了个办法解决这个问题,就是在每行后面加两个表示结束的字符,回车和换行:

回车,符号 \r;是告诉打字机把打印头定位在左边界;

换行,符号 \n;是告诉打字机把纸张向下方移动一行;

https://blog.csdn.net/lijing742180/article/details/85018164

电脑发明后,这一习惯就沿用了下来。但为了节省存储的空间,Unix 和 Mac 做了修改。

  • 在Unix/Linux系统中,行尾只使用换行符 \n,系统会自动加上\r实现 回车+换行 的操作;

  • 在 Mac 系统中,行尾只使用回车符 \r,系统会自动加上 \n实现 回车+换行 的操作;

这对我们通常也没什么影响,键盘上的Enter键自己会处理这个事情。

但如果我们跨系统传输和使用文件时,问题就出来了。

Winddows 的程序传到 Linux不能运行

比如下面这个脚本metaphlan_to_stamp.pl,可能在 windows 下做了修改,保存时自动加了\r,而\r在 Unlix/Linux 上显示为^M,运行时弹出如下错误提示:

metaphlan_to_stamp.pl: /usr/bin/perl^M 解释器错误:没有那个文件和目录

找不到名字为perl^M的解释器,实际应该是用perl做解释器,因为这个是perl脚本。其它语言脚本也会有类似问题,如bash^M, python^M等。

怎么修改呢? 找到这个程序,把\r去掉即可。用下面的命令。

sed -i 's/\r//' metaphlan_to_stamp.pl

# 这是看到什么替换什么
# 但需要注意^M 不是^加 M,而是一个字符
# ^M的输入方式是 先按快捷键ctrl+v,再按快捷键ctrl+m,稍微麻烦一些
sed -i 's/^M//' metaphlan_to_stamp.pl

有时不如果知道程序在什么地方,可以用which返回脚本的路径,直接替换

sed -i 's/\r//' `which metaphlan_to_stamp.pl`

Winddows 的数据传到 Linux不能匹配

我们在做数据提取时,尤其是用awk时,也会遇到这样诡异的问题,代码没问题,测试数据也没问题,换上真实数据就是匹配不出来。

这时别着急,用cat -A filename查看下文件里面有没有特殊字符。也许是因为文件夸了系统捣的鬼。

像下面这个数据最后一列切出来的字符是Cancer^M而不是Cancer;如果用Cancerkey去匹配信息,是匹配不到的。

SampleID^IGroup^M$
C1^ICancer^M$
C2^ICancer^M$

Linux 的数据传到 Windows 打开不换行

Linux 生成的文件,传到 windows,如果用记事本打开,会出现都在一行的情况。尽量不要用记事本,装一个文本查看器,UltraEdit、Notepad 之类的。

往期精品(点击图片直达文字对应教程)

机器学习

后台回复“生信宝典福利第一波”或点击阅读原文获取教程合集

我被跨系统的换行符折磨疯了~~~相关推荐

  1. linux open换行windows,python中遇到的Windows系统中换行符的一个坑

    在项目hex2bin( https://github.com/Root-lee/hex2bin ) 中,需要实现将一个txt文本中的十六进制码转换成相应的ascii码符号并写入一个.dat文件中,以用 ...

  2. 如何在Vim中用换行符替换字符

    我想替换每个,在由新线当前文件: :%s/,/\n/g 但它会插入看起来像^@而不是实际的换行符. 该文件不在DOS模式下或其他任何状态. 我该怎么办? 如果您像我一样好奇,请查看问题, 为什么\\ ...

  3. C#中几种换行符,不同操作系统各不相同【转】

    1.Windows 中的换行符"\r\n" 2.Unix/Linux 平台换行符是 "\n". 3.MessageBox.Show() 的换行符为 " ...

  4. java中换行符号_Java中的回车换行符/n /r /t分析

    首先直接上结论: //换行时采用System.getProperty("line.separator") public void test1() { LogTable logTab ...

  5. java流换行符方法_java换行符的使用方法

    java换行符的使用方法 发布时间:2020-06-22 17:49:56 来源:亿速云 阅读:121 作者:Leah 这篇文章将为大家详细讲解有关java换行符的使用方法,小编觉得挺实用的,因此分享 ...

  6. Java代码中换行符怎么用

    可以使用Java中\n和\r的换行,不过也是有区别的,如下:1.\r 叫回车 Carriage Return2.\n 叫新行 New Line但是都会造成换行,使用System.getProperty ...

  7. 在python中读取文件时如何去除行末的换行符以及在Windows与Linux中的区别

    [时间]2018.11.14 [题目]在python中读取文件时如何去除行末的换行符以及在Windows与Linux中的区别 一.去除换行符 以使用readline进行读取为例: import red ...

  8. Windows、Unix、Mac不同操作系统的换行问题 回车符\r和换行符\n

    一.概念: 换行符'\n'和回车符'\r' (1)换行符就是另起一行  --- '\n' 10 换行(newline) (2)回车符就是回到一行的开头 --- '\r' 13 回车(return) 所 ...

  9. java中处理换行符

    windows平台的换行符为/r/n; linux平台的换行符为/n; java程序中如何将不同平台用户输入的换行符转换成特定系统的换行符. 2.解答 java 代码 String userInput ...

最新文章

  1. linux守护实例有什么用,linux中的信号及进程守护的应用实例分享
  2. ​Swift语言中为外部参数设置默认值可变参数常量参数变量参数输入输出参数
  3. html按钮返回上一步操作,用js实现返回上一步操作
  4. 20-100-040-安装-Centos 7.5 安装MYSQL
  5. 40-10-010-运维-kafka-2.11-基本操作
  6. 指定跳转_炸裂!PPT能一键统一色彩,还能一键跳转到指定颜色
  7. sap后台配置原因代码_【MM配置】Inventory Management 库存管理
  8. C语言的环境搭建(Microsoft Visual Studio 2010的介绍与安装)
  9. delphi中WMI的使用(一)
  10. XML文件解析 --------------------笔记
  11. 结对编程--基于android平台的黄金点游戏(2.0版本)
  12. 计算机EXE文件改参数,exe文件修改器(eXeScope)
  13. 软件自动化测试订飞机票,飞机订票系统自动化测试方案
  14. vod系统必须要用服务器吗,架设美萍VOD点播系统服务器
  15. python写入excel文件出现nan_在python中使用Pandas ExcelWriter时处理Nan
  16. Android状态栏添加快捷开关(Tile)
  17. 计算机考研404是什么意思,研路分享:我的404分考研高分心得体会
  18. VNC源码研究(二十四)vnc-4.0-winsrc版本之winvnc工程分析
  19. 大象跳转:解析微信内自动跳转浏览器打开URL网页的操作步骤
  20. html 隐藏表格某一行,layui怎么隐藏表格行?

热门文章

  1. 【2016年第4期】经济发展的顶层设计 企业战略的终极蓝图—— 产业互联网
  2. 【2016年第4期】大数据时代的简约计算
  3. 数据库系统实训——实验五——存储过程
  4. 【软件工程】业务过程与解决方案
  5. 洛谷 P5742、P5743、P5744 题解
  6. 学习Javascript的书籍(转)
  7. python Exception(异常处理)
  8. Teleport Ultra 抓包工具
  9. oracle 之索引,同义词 ,关键词,视图 ,存储过程,函数,触发器
  10. Essential Grouping高性能的数据分组引擎介绍及下载