2010-11-21 56 views
0

我有一個這樣的文件:如何正確地將文件的一行讀入數組?

1234 1234 "First Name" "Last Name" 

而且我有一個bash函數是這樣的:

function somePeoples() 
{ 
    body='"id":"'$1'","num":"'$2'","name":"'$3'","lname":"'$4'"' 
    echo $body 
} 

這是包含在bash腳本,我會在命令行採購。在這之後,我做了以下測試功能:

$ arr=(1234 1234 "First Name" "Last Name") 
$ somePeoples "{arr[@]}" 
$ "id":"1234","num":"1234","name":"First Name","lname":"Last Name" 
$ somePeoples "${arr[0]}" "${arr[1]}" "${arr[2]}" "${arr[3]}" 
$ "id":"1234","num":"1234","name":"First Name","lname":"Last Name" 

現在,讓我們回到包含這樣行的文件:

input.txt: 
1234 1234 "First Name" "Last Name" 
2234 2234 "Some other name" "Some other last name" 

我嘗試通過讀取文件中的每一行for循環與有限的計數,因爲我知道文件中有多少行。訣竅是讀取每一行,並將每行放入一個數組中傳遞給somePeoples函數。所以我編寫了一個腳本,用這個函數來獲取另一個腳本。就讓我們把它叫做客戶端腳本,讓我們假裝它實際上循環:

the client script: 
arr=(`sed -n "1p" input.txt`) 
somePeoples "${arr[@]}" 

但我的恐懼輸出:

$ "id":"1234","num":"1234","name":""First,"lname":"Name"" 

此外,試圖做這些收益率相同的結果

somePeoples "${arr[0]}" "${arr[1]}" "${arr[2]}" "${arr[3]}" 
somePeoples `sed -n "1p" input.txt` 

有什麼區別?當我使用相同的引用模式在命令行輸入它時,它工作正常,但是當我從文件讀取輸入並將其傳遞給某個數組或直接傳遞給該函數時,無法正常工作。爲什麼即使引用了參數,它也會在空格上打破?而且,呃,我如何防止這種情況發生?

我實際上正在嘗試準備一個以jSON格式傳遞給cURL的請求體,並且輸入參數包含在長達數百行的文件中。但我認爲cURL的東西與這個問題無關,因爲我僅通過bash來重現問題。

回答

1

如果像你說的,原始的數據文件是CSV格式時,那麼你可能會更好做一些簡單的像

IFS=, while read id num name lname; do 
    ... 
done <input.txt 
+0

非常感謝。 IFS做了訣竅:) – avendael 2010-11-21 17:15:03

1

這並沒有真正解決爲什麼引用不起作用的問題(我假設你嘗試了單引號),但如果一個快速和骯髒的解決方案是可以接受的,你可以通過regexp將空間轉換爲其他東西,和回位需要

+0

其實我覺得我犯了一個錯誤。原始輸入文件是每列帶引號值的csv文件。我把逗號和空格重新組合,而且我失敗了。感謝您的建議。我認爲空間不是這個問題的正確分界符。 – avendael 2010-11-21 16:55:12

0

好了,所以這是我在將輸入文件轉換爲csv後執行:

ORIG_IFS=$IFS 
IFS=$(echo -en ",") 
arr=(`sed -ns "1p" input.txt`) # nvm the extension 
IFS=$ORIG_IFS 
somePeoples "${arr[@]}" 

這樣產生的輸出:

"id":"1234","num":"1234","name":""First Name"","lname":""Last Name"" 

引述的字符串有雙帶雙引號。幾乎接近。也許我需要先清理輸入文件?

sed -e 's/"//g' <input.txt> input.txt.new 

然後這就是我用來最終得到我想要的輸出。謝謝你們:)直到現在,永遠不知道IFS。

+0

沒有理由使用echo來設置IFS,只需執行IFS =或者IFS =','。 – 2010-11-21 21:45:23