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

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

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

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

于是发现了下载规律很重要。由于下载链接不像SRA那样,只能自己通过寻找下载规律,于是乎,发现了下载有如下规律:https://wwwn.cdc.gov/Nchs/Nhanes/1999-2000/AUX1.XPT,前缀:https://wwwn.cdc.gov/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.cdc.gov/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.txtcut -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)

相关推荐

  • 手把手教你在NHANES库里下临床数据

    美国国家健康与营养调查(NHANES,National Health and Nutrition Examination Survey)是 一项旨在评估美国成人和儿童健康和营养状况的研究计划,该调查的 ...

  • Linux 常用 ls命令详解

    ls命令是linux常用命令之一,用于在命令控制台提示符中列出目录和文件信息.   一.ls命令用法: ls命令运行在命令提示符终端,用法如下.其中[选项]和为可选参数,可以一零个或者多个选项:[文件 ...

  • 【Linux 笔记】Linux 基本操作 - 02. shell编程基础

    笔记接上篇[Linux 笔记]Linux 基本操作 - 01. 系统认知-文本处理-软件安装-环境变量.笔记大部分源于生信技能树的B站视频教程[生信技能树]生信人应该这样学linux(更新至第14集) ...

  • 《Linux 命令行大全》.pdf

    今天跟大家推荐个 Linux 命令行教程:<The Linux Command Line>,中文译名:<Linux 命令行大全>. 该书作者出自自美国一名开发者,兼知名 Lin ...

  • 选择 Linux 命令行而非 GUI 的 5 个理由

    作为 Linux 新手,肯定会喜欢图形用户界面 (GUI) .而且,如果没有 GUI,从 Windows 转移可能有点困难.不熟悉的语法和记住命令的需要一开始可能会让您感到害怕,但从长远来看,熟悉命令 ...

  • 如何在Linux命令行下查看帮助?linux技术

    Linux运维是现下较为火热的职业岗位之一.市场对于Linux运维的需求逐渐增加.学习Linux运维技术的人越来越多.Linux命令对于Linux运维工程师来说是必备技能.对于刚接触Linux运维技术 ...

  • Linux命令行提示符有什么意义?linux系统操作

    Linux命令行提示符有什么意义?都表示什么?Linux命令行结尾的提示符有"#"和"$"两种不同的符号.Linux是一个以命令行管理为主的操作系统,Linux ...

  • Linux命令行作用和意义是什么?学习笔记

    众所周知,Linux是一个以命令行管理为主的操作系统,即通过键盘输入指令管理系统的相关操作,包括但不限于编辑文件.启动停止服务等.那么Linux命令行有什么作用?Linux命令行的意义是什么? 使用鼠 ...

  • 《Linux命令行大全》:第一部分第一章:何为shell

    原创快乐江湖啊2021-03-05 08:59:23 前言:什么是shell 首先需要明确的一点是,我们经常口中提到的命令行,其实指的就是shell,那么shell是什么呢,这就不得不用下面这么一张图 ...

  • 【好书共享】Linux命令行与shell脚本编程,你会了么

    为什么要学,怎么学? 一般的生信软件都是Linux版本的,所以你处理软件,就要去Linux系统安装使用了.学习Linux命令行是为了在黑白界面安装运行软件.查看整理文件.切换目录,就像咱们在windo ...

  • Linux命令行基础,关于Bash需要知道的一些常识

    介绍 Linux越来越重要,对于开发者来说学习必要的bash技术必不可少,对运维来说更是如此.学习shell可以参考很多学习材料和图书,比如ChinaUnix论坛网中人大哥总结的<Shell十三 ...

  • 如何使用Linux命令行删除文件和目录

    [日期:2019-08-06] 来源:Linux公社 作者:醉落红尘 在本教程中,我们将向您展示如何使用rm命令通过示例和最常见的rm选项的说明来删除文件和目录. 如何删除文件 要从命令行删除(或删除 ...