分享

Linux命令行,菜鸟报错之隐藏在换行中的字符^M

 健明 2021-07-14

---by mk 2021-3-13 24:00

本人跟着Jimmy老师学习生信已经1+年,滚爬摩打,已经入行RLinux。近日,需要在某公共数据库 网站下载资料,打开网页是这样的:

其中需要下载的资料多达174项,根据Jimmy老师所教的,当然是批量下载啦,21世纪了,还手工一 个个点击下载,会被吐槽的!!!!

于是发现了下载规律很重要。由于下载链接不像SRA那样,只能自己通过寻找下载规律,于是乎,发现了下载有如下规律:https://wwwn./Nchs/Nhanes/1999-2000/AUX1.XPT,前缀:https://wwwn./Nchs/ Nhanes/,然后拼接年份:1999-2000,最后是文件名:AUX1.XPT。好办。

第一步:了解上图NHANES Examination Variable List,进入变量列表,多大1.6万个变量,为了后续 注释,下载下来,命名为NHANESExaminationData.txt,本人比较喜欢在Rstudio上用R 拼接,然后再 去Linux 通过bash下载。通过以下代码读进R里长这样:

rm(list = ls())
dat <- data.table::fread('NHANESExaminationData.txt',
             data.table = F)

取子集,获取自己想要的拼接网址内容:

tmp <- dat[,c(3,5,6)]
tmp$fileNames <- paste0('https://wwwn./Nchs/Nhanes/',tmp$V5,'-',
            tmp$V6,'/',tmp$V3,'.XPT')
##去重
final <- tmp[!duplicated(tmp$fileNames),]
##查看最后目标数据
final$fileNames[1:3]
##保存文件,后续交给Linux批量下载
write.table(final,file='downlaod_file.txt',col.names = F,
      row.names = F,sep = ',',quote = F)

第二步:本人Windows下安装了ubuntu子系统,所以,可以直接打开ubuntu:cd到目标目录,本人的资料保存在桌面,并列出文件下文件:

查看downlaod_file.txt

cut -d ',' -f 4 downlaod_file.txt |head

得到如下网址信息:

重定向写入url.txt,为后续bash脚本下载。

cut -d ',' -f 4 downlaod_file.txt >>url.txt

在cat查看最后构建的url文件:

cat url.txt |head

得到如下结果:

第三步:一切准备就绪,剩下就交给最常用的下载方法,批量下载,构建脚本文件:

#!/bin/bash
cat url.txt | while read id; do (wget $id);done

(当然,也可以直接在命令行输入) 然后走

bash bash.txt

纳尼,居然报错:

细心检查发现,居然在自己构建的网址中,通过cat循环读取下载,网址末尾居然多了:%0D

思考:

1.分析原因:构建的网址下载失败,从显示的下载链接,是因为在.XPT末尾多了%0D,那为什么构建的网址末尾会多了这些字符串呢?

2.一定是网址显示时没有把换行符显示出来,那么怎么查找linux下的换行符?搜索发现,命令如下:

cat -An url.txt

发现末尾多了**^M,$**为换行符:

3.如何解决?此时,想起Jimmy老师经常教育我们菜鸟的话:(1)编程的能力就是解决问题的能力;(2)要学会自己搜索。于是乎,打开我的https://cn.bing.com/ 搜索:^M$ linux找到了:https://www.jb51.net/article/142224.htm本人尝试了第一种,先看看自己的ubuntu子系统有没有安装dos2unix命令

dos2unix --help

结果是没有安装,于是乎,尝试第二条:sedcutawksed处理字符串三大马车之一)

sed-i 's/^M``//g``' url.txt
#注意:^M的输入方式是 Ctrl + v ,然后Ctrl + M

在查看cat -An url.txt,完美解决^M:

如是乎,开始了愉快的下载:

体会:发现问题很重要,一旦出现了报错,失败,一定要去找原因,并且,要有良好的思维方式。最后最后,告诉大家,紧跟Jimmy大神,可以帮助自己省力省时,提供生产力哟!

文末友情推荐

    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多