2014-01-30 120 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

相關問題