我被跨系统的换行符折磨疯了~~~
不同的操作系統使用的換行符不同,如 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;如果用Cancer做key去匹配信息,是匹配不到的。
SampleID^IGroup^M$ C1^ICancer^M$ C2^ICancer^M$Linux 的數據傳到 Windows 打開不換行
Linux 生成的文件,傳到 windows,如果用記事本打開,會出現都在一行的情況。盡量不要用記事本,裝一個文本查看器,UltraEdit、Notepad 之類的。
往期精品(點擊圖片直達文字對應教程)
機器學習
后臺回復“生信寶典福利第一波”或點擊閱讀原文獲取教程合集
總結
以上是生活随笔為你收集整理的我被跨系统的换行符折磨疯了~~~的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 卷积神经网络CNN(6)—— YOLOv
- 下一篇: JVM_垃圾收集器与内存分配策略01