如何正确地将文件的一行读入数组?

问题描述:

我有一个这样的文件:如何正确地将文件的一行读入数组?

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来重现问题。

如果像你说的,原始的数据文件是CSV格式时,那么你可能会更好做一些简单的像

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

非常感谢。 IFS做了诀窍:) – avendael 2010-11-21 17:15:03

这并没有真正解决为什么引用不起作用的问题(我假设你尝试了单引号),但如果一个快速和肮脏的解决方案是可以接受的,你可以通过regexp将空间转换为其他东西,和回位需要

+0

其实我觉得我犯了一个错误。原始输入文件是每列带引号值的csv文件。我把逗号和空格重新组合,而且我失败了。感谢您的建议。我认为空间不是这个问题的正确分界符。 – avendael 2010-11-21 16:55:12

好了,所以这是我在将输入文件转换为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