Bash:将制表符分隔的文件行读入数组

我想将文件逐行读入脚本。 文件中的每一行都是由一个tab分隔的多个值,我想将每行读入一个数组。

典型的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中为此build立了支持?

你非常接近:

 while IFS=$'\t' read -r -a myArray do echo "${myArray[0]}" echo "${myArray[1]}" echo "${myArray[2]}" done < myfile 

-r read \并不是特殊的input数据; -a myArray告诉它将input行分成单词并将结果存储在myArray ; IFS=$'\t'告诉它只使用制表符来分割单词,而不是常规的Bash默认值也允许空格分割单词。注意,这种方法将把一个或多个制表符作为分隔符,所以如果任何一个字段为空,后面的字段将被“移位“进入阵容中的先前位置,是吗?)

如果你真的想把每个单词(bash意思)拆分成一个完全不同的数组索引,并且每次while循环迭代都要改变数组,那么@ ruakh的答案就是正确的方法。 但是您可以使用read属性将每个读取的单词分割成不同的variablescolumn1column2column3就像这段代码片段一样

 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" 

以避免数组索引访问,并通过使用有意义的variables名称来提高代码的可读性(当然,使用columnN并不是一个好主意)。

你也可以试试,

 OIFS=$IFS; IFS="\t"; animals=`cat animals.txt` animalArray=$animals; for animal in $animalArray do echo $animal done IFS=$OIFS;