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属性将每个读取的单词分割成不同的variablescolumn1
, 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"
以避免数组索引访问,并通过使用有意义的variables名称来提高代码的可读性(当然,使用columnN
并不是一个好主意)。
你也可以试试,
OIFS=$IFS; IFS="\t"; animals=`cat animals.txt` animalArray=$animals; for animal in $animalArray do echo $animal done IFS=$OIFS;