我想逐行将文件读入脚本。文件中的每一行都是由制表符分隔的多个值,我想将每一行读入一个数组。
典型的bash“逐行读取”示例;
while read line
do
echo $line;
done < "myfile"
对我来说,myfile看起来像这样(制表符分隔值);
value1 value2 value3
value4 value5 value6
在循环的每次迭代中,我希望每一行都进入一个数组,所以我可以
while read line into myArray
do
echo myArray[0]
echo myArray[1]
echo myArray[2]
done < "myfile"
这将在第一次循环迭代中打印以下内容;
value1
value2
value3
然后在第二次迭代时它会打印
value4
value5
value6
这可能吗?我能看到的唯一方法就是编写一个小函数来手动分解值,bash中是否有内置支持?
答案 0 :(得分:122)
你非常接近:
while IFS=$'\t' read -r -a myArray
do
echo "${myArray[0]}"
echo "${myArray[1]}"
echo "${myArray[2]}"
done < myfile
(-r
告诉read
\
在输入数据中并不特殊; -a myArray
告诉它将输入行拆分为单词并存储结果为myArray
;并且IFS=$'\t'
告诉它仅使用制表符来分割单词,而不是常规的Bash默认值也允许空格分割单词。请注意,此方法将处理一个或更多标签作为分隔符,因此如果任何字段为空,则后面的字段将“移位”到数组中的较早位置。这样可以吗?)
答案 1 :(得分:8)
如果你真的想把每个单词(bash含义)拆分成一个不同的数组索引,在每个while循环迭代中完全改变数组,@ ruakh的回答是正确的方法。但您可以使用read属性将每个读取的单词拆分为不同的变量column1
,column2
,column3
,如此代码段
while IFS=$'\t' read -r column1 column2 column3 ; do
printf "%b\n" "column1<${column1}>"
printf "%b\n" "column2<${column2}>"
printf "%b\n" "column3<${column3}>"
done < "myfile"
通过使用有意义的变量名来达到类似的结果,避免数组索引访问并提高代码可读性(当然使用columnN
并不是一个好主意。)
答案 2 :(得分:0)
您也可以尝试,
OIFS=$IFS;
IFS="\t";
animals=`cat animals.txt`
animalArray=$animals;
for animal in $animalArray
do
echo $animal
done
IFS=$OIFS;