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

时间:2012-03-16 11:10:12

标签: arrays bash

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

典型的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中是否有内置支持?

3 个答案:

答案 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属性将每个读取的单词拆分为不同的变量column1column2column3,如此代码段

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;