2014-01-30 118 views
6

我试图使用wget和url从数据库下载文件。例如。从Linux中形成的文本文件中读取内容bash

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

因此该网址的格式是这样:http://www.rcsb.org/pdb/files/($ IDNumber中).PDB”

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

!/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 

因此,.pdbhttp填充。我无法弄清楚为什么。有人有想法吗? 我该如何格式化它,所以url是

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

? 非常感谢。

注意。这个问题被标记为'如何在bash中连接字符串'的重复?但我其实是在寻求别的东西。我在问这个问题之前先阅读了这个问题,结果发现我的问题是在Windows中准备txt文件,而不是真正的字符串诡计。我编辑了问题标题。我希望现在更清楚。

+0

你能发表几行'id_numbers.txt'吗? – iamauser

+0

使用'cat -A'显示'id_numbers.txt'。另外,您几乎可以肯定读取的是'-r'标志,尽管在这种情况下它可能会或可能不会改变任何内容。 – BroSlow

回答

0

试试这个:

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

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

+1

等效但更长,但仍不能解决回车问题。 – chepner

+0

我实际上已经尝试了完全相同的东西:)但chepner是正确的并不能解决回车问题。 – user3254054

2

-e回声选项用于输出所需的内容,而无需插入新行,你不需要在这里。

另外我怀疑你的文件包含的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 
+1

或id_nums.txt已在Windows上创建并具有\ r \ n行结尾。阿戈登已经接受了这一点。 'dos2unix文件'。祝你们好运。 – shellter

+1

是的,我也怀疑这个,我的答案的第二句话。 – aymericbeaumet

+0

嗨,你说得对。我已经在Windows中的Notepad ++中创建了.txt文件。这导致了这个问题。我在那里用'echo'命令查看我正在形成的url,以便我可以排除故障。感谢您的回应。 – user3254054

6

这听起来像你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文件转换。

+0

这工作!非常感谢你。我认为这是由于回车,但我还没有想出如何摆脱它。非常感激! – user3254054

相关问题