【问题标题】:Read content from text file formed in Windows in Linux bash [duplicate]在Linux bash中从Windows中形成的文本文件中读取内容[重复]
【发布时间】:2014-02-23 02:11:56
【问题描述】:

我正在尝试使用 wget 和 url 从数据库下载文件。例如

wget "http://www.rcsb.org/pdb/files/1BXS.pdb"

所以url的格式是这样的:http://www.rcsb.org/pdb/files/($idnumber).pdb"

但是我有很多文件要下载;所以我写了一个 bash 脚本,它从文本文件中读取 id_numbers,形成 url 字符串并通过 wget 下载。

!/bin/bash

while read line
do
url="http://www.rcsb.org/pdb/files/$line.pdb"
echo -e $url
wget $url
done < id_numbers.txt

但是,url 字符串的格式为

.pdb://www.rcsb.org/pdb/files/4H80

所以,.pdb 替换为 http。我不知道为什么。有人有想法吗? 我怎样才能格式化它,所以 url 是

"http://www.rcsb.org/pdb/files/($idnumber).pdb"

? 非常感谢。

注意。这个问题被标记为“如何在 bash 中连接字符串?”的重复项。但我实际上是在要求别的东西。我在问这个问题之前阅读了这个问题,事实证明我的问题是在 Windows 中准备 txt 文件而不是真正的字符串连接。我编辑了问题标题。我希望现在更清楚了。

【问题讨论】:

  • 可以发几行id_numbers.txt吗?
  • 使用cat -A 显示id_numbers.txt。此外,您几乎可以肯定读取 -r 标志,尽管在这种情况下它可能会或可能不会改变任何东西。

标签: string bash string-concatenation


【解决方案1】:

试试这个:

url="http://www.rcsb.org/pdb/files/"$line
$url=$url".pdb"

欲了解更多信息,请查看How to concatenate string variables in Bash?

【讨论】:

  • 等效,但更长,仍然不能解决回车的问题。
  • 我实际上已经尝试过完全相同的事情 :) 但 chepner 是对的并不能解决回车问题。
【解决方案2】:

-eecho 选项用于在不插入新行的情况下输出所需内容,此处不需要。

我还怀疑您的包含 id 的文件格式不正确,您是在哪个操作系统上创建的?

无论如何,您可以通过这种方式简化您的脚本:

!/bin/bash

while read line
do
    wget "http://www.rcsb.org/pdb/files/$line.pdb"
done < id_numbers.txt

我能够使用像这样生成的id_numbers.txt 文件成功测试它:

for i in $(0 9) ; do echo "$i" >> id_numbers.txt ; done

【讨论】:

  • 或 id_nums.txt 是在 Windows 上创建的,并且具有 \r\n 行结尾。阿戈登已经注意到了这一点。 dos2unix file。祝大家好运。
  • 是的,我也怀疑这一点,我回答的第二句话。
  • 嗨,你是对的。我在 Windows 的 Notepad++ 中形成了 .txt 文件。这导致了问题。我在那里有echo 命令来查看我正在形成的网址,以便我可以进行故障排除。感谢您的回复。
  • 在这种情况下,您只需要更改@Gordon 所说的行分隔符 (IFS)。如果你想要一些干净的东西,我的代码仍然有效(只需在 while 循环之前添加IFS=$'\r')。
【解决方案3】:

听起来您的 id_numbers.txt 文件具有 DOS/Windows 样式的换行符(回车后跟换行符)而不是普通的 unix 换行符(只是换行符)。结果是read 认为该行以回车结束,$line 实际上在末尾有一个回车,并且嵌入在 url 中,造成各种混乱。

有几种方法可以解决这个问题。当你使用它时,你可以让 bash 从变量中修剪回车:

url="http://www.rcsb.org/pdb/files/${line%$'\r'}.pdb"

或者你可以让read 修剪它,告诉它回车算作空格(read 将从它读取的内容中修剪前导和尾随空格):

while IFS=$'\r' read line

或者您可以使用 dos2unix(或您的操作系统上的任何等效命令)之类的命令来转换 id_numbers.txt 文件。

【讨论】:

  • 这成功了!非常感谢。我认为这是由于回车引起的,但我还没有弄清楚如何摆脱它。非常感谢!
猜你喜欢
  • 2021-05-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-24
  • 1970-01-01
  • 2010-12-13
  • 1970-01-01
相关资源
最近更新 更多