今天同门遇到这么一个报错,她的samplelist文件里有6 行,如下
SRR14316550
SRR14316551
SRR14316552
SRR14316553
SRR14316554
SRR14316555
但在使用如下命令的时候输出却出现了问题
cat samplelist | while read id ; do echo "${id}_1.fastq.gz"; done
输出为
_1.fastq.gz
_1.fastq.gz
_1.fastq.gz
_1.fastq.gz
_1.fastq.gz
为什么没有输出${id}的内容呢?
经过一番检索我发现,在使用命令行时,如果samplelist文件中的文本使用了DOS换行符(\r\n),则可能会导致输出结果不正确。
只需要使用 dos2unix 命令将samplelist文件中的换行符转换为Unix格式,然后再运行命令即可。
dos2unix samplelist
在 Unix/Linux 系统中,文件中的文本行使用一个单独的换行符(\n)来标记行的结束。而在 DOS/Windows 操作系统中,每一行的末尾会有两个字符来表示换行:一个回车符(\r),一个换行符(\n)。
因此,在 Linux 系统中处理来自 Windows 系统的文件时,换行符可能会导致输出结果不正确。使用 dos2unix 命令可以将文件中的回车符(\r)去除,使行末只剩下Unix格式的换行符 (\n), 这样在Linux上执行时就不会出现问题了。
为了确定此问题出现的原因,我按照她的方法复现此问题。
首先她使用cat>samplelist创建文件samplelist。
创建完成后双击左侧的文件打开,直接在MobaTextEditor里编辑,并保存。
再查看samplelist的时候似乎看不出什么端倪,只有SRR1004出现在了用户名前面。
成功复现${id}无法输出的问题
根据我们前面的猜测,我们通过cat -A [Filename]来查看一下samplelist的换行符。
如上图所示,这是Windows形式的换行符, \r 对应符号 ^M ,\n 对应符号 $。
需要注意的是,使用vi编辑器的set list命令显示特殊字符是无法显示^M的,只有用vi的二进制模式( vi -b [FileName] )打开,才能够显示出 ^M。
MobaXterm 真的很方便,集成了编辑器、图形显示器、SFTP、进程监测等等,但我没想到也会因此致使报错,希望给使用 MobaXterm 的读者一个教训吧。